it-roy-ru.com

Как передать данные в BroadcastReceiver?

Я пытаюсь сделать так, чтобы числа, на которые мое приложение отправляло сообщения, передавались в BraodcastReceiver ... но пока либо я получаю нулевое значение, либо 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
14
Ahmed S. Durrani

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

В 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>

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

31
Ahmed S. Durrani

Вы запускаете Activity вместо трансляции Intent. Попробуйте изменить

startActivity(intent);

в 

sendBroadcast(intent);

ОБНОВЛЕНИЕ:

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

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

Вы бы отправили трансляцию так:

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
Jason Robinson

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

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");

   }
}
0
BinMan1