2012-04-05 2 views
7

То, что я пытаюсь сделать это, что числа, к которому мое приложение посылает сообщения, которые передаются BraodcastReceiver ... но до сих пор ни я получаю нулевой или BroadcastReceiver просто падает ..Как передавать данные в BroadcastReceiver?

вот мой намерение для BroadcastReceiver из класса CreateMessage ...

 Intent intent = new Intent(); 
     Bundle bundle = new Bundle(); 
     bundle.putString("phN", phoneNo); 
     intent.putExtras(bundle); 
     startActivity(intent); 

И в BroadcastReceiver (класс SmsReceiver) Я пытаюсь поймать намерение, как это ..

public void onReceive(Context context, Intent intent) { 
    //---get the SMS message passed in--- 
    Bundle bundle = intent.getExtras(); 
    try{ 
    //receiveNumbers = intent.getExtras().get("phN").toString(); 
     String receiveNumbers = intent.getStringExtra("phN"); 
     Toast.makeText(context, receiveNumbers, Toast.LENGTH_LONG).show(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 

Мой манифеста Файл:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.AEM_n" 
     android:versionCode="2" android:versionName="2.0"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS"/> 
    <uses-permission android:name="android.permission.READ_SMS"/>  
    <uses-permission android:name="android.permission.SEND_SMS"/> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> 
     <activity android:name=".new_menu" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:label="@string/app_name" 
      android:name=".SetEvent" > 
      <intent-filter> 
       <action android:name="com.AEM_n.SETEVENT" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      </activity> 
      <activity 
      android:label="@string/app_name" 
      android:name=".AddParticipants" /> 
      <activity 
      android:label="@string/app_name" 
      android:name=".CreateMessage" /> 
      <activity 
      android:label="@string/app_name" 
      android:name=".DataBaseClass" /> 
      <activity 
      android:label="@string/app_name" 
      android:name=".IntentReceiver"/> 
      <activity 
      android:label="@string/app_name" 
      android:name=".SmsReceiver" 
      /> 
      <receiver android:name=".SmsReceiver" android:exported="true"> 
      <intent-filter android:priority="999"> 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
      </intent-filter> 
      </receiver> 
    </application> 

</manifest> 

Я уже перепробовал все ответы, данные Stackoverflow ... Но не использовать ...

Пожалуйста, ребята, скажите мне, где я неправильно ... Спасибо!

Журнал ошибок:

04-07 02:34:02.770: ERROR/AndroidRuntime(25593): FATAL EXCEPTION: main 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593): java.lang.RuntimeException: Error receiving broadcast Intent { act=com.myapp.myaction (has extras) } in [email protected] 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at android.os.Handler.handleCallback(Handler.java:587) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at android.os.Looper.loop(Looper.java:123) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at android.app.ActivityThread.main(ActivityThread.java:3701) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at dalvik.system.NativeStart.main(Native Method) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593): Caused by: java.lang.NullPointerException 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at com.AEM_n.SmsReceiver.onReceive(SmsReceiver.java:37) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709) 
04-07 02:34:02.770: ERROR/AndroidRuntime(25593):  ... 9 more 
+1

Класс Intent имеет метод 'putExtra()'. Нет необходимости в явной конструкции «Bundle». Кроме того, 'startActivity()' не доставляет намерения вещательным приемникам - он начинает свою деятельность. –

+0

как вы вещаете это вещание, используя 'sendBroadcast' и' sendOrderedBroadcast'? –

+0

зачем вам нужно вещание? Ваша цель - передать данные между двумя действиями? или что? – iTurki

ответ

22

Следуя примеру @Jason «S ... Я сделал это ...

В MainActivity или любая деятельность от где вы хотите отправить умысел

Intent intent = new Intent("my.action.string"); 
intent.putExtra("extra", phoneNo); \\ phoneNo is the sent Number 
sendBroadcast(intent); 

, а затем в моем SmsReceiver классе я сделал это

public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    Log.i("Receiver", "Broadcast received: " + action); 

    if(action.equals("my.action.string")){ 
    String state = intent.getExtras().getString("extra"); 

    } 
} 

И в Manifest.xml я добавил "my.action.string" хотя это был вариант ..

<receiver android:name=".SmsReceiver" android:enabled="true"> 
    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     <action android:name="my.action.string" /> 
     <!-- and some more actions if you want --> 
    </intent-filter> 
</receiver> 

работал как шарм !!

+0

Я работаю над довольно похожей концепцией, которую нужно обработать моим приложением. В моем случае я должен передавать данные через механизм взаимодействия, который я определил как SMS, с одного устройства на другое. Возможно ли отправить данные так же, как вы, присвоив целям значения? Как сделать мое приложение стандартным приложением для обработки при получении sms? – JPerk

0

Вы Начинание Activity вместо вещания Intent. Попробуйте изменить

startActivity(intent); 

в

sendBroadcast(intent); 

UPDATE:

Вы не установлено никаких действий и не имя компонента в Intent. Попробуйте создать намерение следующим образом:

Intent intent = new Intent(context, YourReceiver.class); 
intent.putExtra("phN", phoneNo); 
sendBroadcast(intent); 
+0

просто попробовал ... null –

+0

Что именно null? – pepyakin

+0

В моем получающем классе 'String receiveNumbers = intent.getStringExtras (" phN ";' –

0

Вы бы послать широковещательный так:

Intent intent = new Intent(action); 
intent.putExtra("phN", phoneNo); 
sendBroadcast(intent); 

Параметр action является String, что коррелирует с действиями, зарегистрировавшего BroadcastReceiver с. Так что если вы зарегистрировали ваш приемник следующим образом:

MyBroadcastReceiver receiver = new MyBroadcastReceiver(); 
registerReceiver(receiver, new IntentFilter("com.myapp.myaction")); 

тогда action будет "com.myapp.myaction"

+0

Где я регистрирую свой BroadcastReceiver? В моем классе активности? –

+0

Да, обычно в методе 'onCreate()'. Обязательно также вызывать 'unregisterReceiver (receiver)' в методе 'onDestroy()' (это означает, что вам нужно будет иметь ссылку на класс для получателя). –

+0

См. мой файл манифеста ... Я пробовал ваш код ... но приложение продолжает сбой. –

-2

использование sendbroadcast вместо startactivity.it будет работать .. !!

0

Ваша проблема очень проста. Достаточно того, что изменение onRecive() имеет код:

public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    Log.i("Receiver", "Broadcast received: " + action); 

    if(action.equals("my.action.string")){ 
     String state = bundle.getString("phN"); 

    } 
} 
Смежные вопросы