web-dev-qa-db-fra.com

Envoi de l'intention à BroadcastReceiver de adb

J'ai la classe BroadcastReceiver:

public class IntentReceiver extends BroadcastReceiver {

    final String tag = "Intent Intercepter";

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            String data = intent.getStringExtra("sms_body");
            Log.i(tag, data);
            Toast.makeText(context, data.subSequence(0, data.length()), Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            Toast.makeText(context, "Intercepted", Toast.LENGTH_LONG).show();
        }
    }
}

Et aussi dans manifeste:

<receiver Android:name="com.whereismywifeserver.IntentReceiver" Android:enabled="true">
    <intent-filter Android:priority="999">
        <action Android:name="com.whereismywifeserver.intent.TEST"/>
    </intent-filter>
</receiver>

Mais lorsque j'essaie d'envoyer une intention de adb, je reçois une erreur:

C:\Users\i.yesilevsky>adb Shell am start -a com.whereismywifeserver.intent.TEST
--es sms_body "test from adb" -c Android.intent.category.HOME -n  com.whereismywifeserver/.IntentReceiver
Starting: Intent { act=com.whereismywifeserver.intent.TEST t=[Android.intent.category.HOME] cmp=com.whereismywifeserver/.IntentReceiver (has extras) }
Error type 3
Error: Activity class {com.whereismywifeserver/com.whereismywifeser
ver.IntentReceiver} does not exist.

Lorsque je crée une intention dans le code, tout fonctionne correctement. Alors, comment puis-je envoyer une intention de adb?

34
user2106655

Vous n'avez pas besoin de spécifier le destinataire. Vous pouvez utiliser adb à la place.

adb Shell am broadcast -a com.whereismywifeserver.intent.TEST 
--es sms_body "test from adb"

Pour plus d'arguments, tels que les extras d'entiers, voir documentation .

69
Zohra Khan

J'ai trouvé que la commande était incorrecte, la commande correcte contient "broadcast" au lieu de "start":

adb Shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb" -n com.whereismywifeserver/.IntentReceiver
23
user2106655

J'ai eu le même problème et j'ai découvert qu'il fallait échapper à des espaces supplémentaires:

adb Shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test\ from\ adb"

Donc, au lieu de "test from adb", il devrait être "test\from\adb"

2
melbic

Comme beaucoup l'ont déjà remarqué, le problème ne se manifeste que si la chaîne supplémentaire contient des espaces.

La cause principale est que le système d'exploitation hôte OS/Shell de l'OP (Windows/cmd.exe) modifie la commande entrée - les caractères " sont perdus, --es sms_body "test from adb" devient --es sms_body test from adb. Il en résulte que sms_body chaîne supplémentaire reçoit la valeur test et que le reste de la chaîne devient un spécificateur <URI>|<PACKAGE>|<COMPONENT>.

Pour éviter tout ce que vous pourriez utiliser:

adb Shell "am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body 'test from adb' -n com.whereismywifeserver/.IntentReceiver"

ou commencez simplement la session interactive adb Shell en premier et exécutez la commande am broadcast à partir de l'intérieur.

2
Alex P.

Une autre chose à garder à l'esprit: Android 8 limite les récepteurs pouvant être enregistrés via manifeste (par exemple, de manière statique)

https://developer.Android.com/guide/components/broadcast-exceptions

2
Yang

Le véritable moyen d’envoyer une diffusion à partir de la commande ADB est:

adb Shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb"

Et, -a signifieACTION, --es signifie que vous envoyez un String extra. 


PS. Il existe d’autres types de données que vous pouvez envoyer en spécifiant différents paramètres tels que:

[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--esn <EXTRA_KEY> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]
[--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]
[--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]
[--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE>]
[--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
    (mutiple extras passed as Integer[])
[--eial <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...]]
    (mutiple extras passed as List<Integer>)
[--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
    (mutiple extras passed as Long[])
[--elal <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...]]
    (mutiple extras passed as List<Long>)
[--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
    (mutiple extras passed as Float[])
[--efal <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]
    (mutiple extras passed as List<Float>)
[--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
    (mutiple extras passed as String[]; to embed a comma into a string,
     escape it using "\,")
[--esal <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]
    (mutiple extras passed as List<String>; to embed a comma into a string,
     escape it using "\,")
[-f <FLAG>]

Par exemple, vous pouvez envoyer une valeur int de:

--ei int_key 0
1
CalvinChe

Noter ma situation ici peut être utile à quelqu'un,

Je dois envoyer une intention personnalisée avec plusieurs extras d'intention à un récepteur de diffusion sous Android P,

Les détails sont,

Nom du destinataire: com.hardian.testservice.TestBroadcastReceiver

Intention action = "com.hardian.testservice.ADD_DATA" 

les extras d'intention sont, 

  1. "text" = "test msg", 
  2. "source" = 1,

Exécutez ce qui suit en ligne de commande.

adb Shell "am broadcast -a com.hardian.testservice.ADD_DATA --es text 'test msg' --es source 1 -n com.hardian.testservice/.TestBroadcastReceiver"

J'espère que cela t'aides.

0
Hardian