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?
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 .
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
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"
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.
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
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
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,
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.