web-dev-qa-db-fra.com

Comment transmettre des données à BroadcastReceiver?

Ce que j'essaie de faire, c'est que les numéros auxquels mon application envoie des messages sont transférés au BraodcastReceiver ... mais jusqu'à présent, je suis devenu nul ou BroadcastReceiver se bloque simplement.

voici mon intention pour BroadcastReceiver de la classe CreateMessage ...

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

Et dans BroadcastReceiver (classe SmsReceiver), je tente d’attraper une telle intention.

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();
    }

Mon fichier manifeste:

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

J'ai déjà essayé toutes les réponses données à Stackoverflow ... Mais pas d'utilisation ...

S'il vous plaît, les gars, dites-moi où je me trompe ... Merci!

Journal des erreurs: 

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 com.AEM_n.SmsReceiver@405a07c8
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

En suivant l’exemple de @Jason ... j’ai fait cela ...

Dans MainActivity ou toute activité à partir de laquelle vous souhaitez envoyer une intention

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

puis dans ma classe SmsReceiver, je l'ai fait 

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

  }
}

Et dans manifest.xml, j’ai ajouté "my.action.string" même si c’était une option ..

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

travaillé comme un charme !!

31
Ahmed S. Durrani

Vous commencez une Activity au lieu de diffuser Intent. Essayez de changer

startActivity(intent);

à 

sendBroadcast(intent);

METTRE &AGRAVE; JOUR:

Vous définissez aucune action et aucun nom de composant sur Intent. Essayez de créer une intention comme suit:

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

Vous enverriez une émission comme ceci:

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

Le paramètre action est une String qui correspond à l'action avec laquelle vous avez enregistré BroadcastReceiver. Donc, si vous avez enregistré votre récepteur comme suit:

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

alors action serait "com.myapp.myaction"

0
Jason Robinson

Votre problème est en réalité très simple. Il suffit que le code onReceive () change comme ça:

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