Отправка намерения BroadcastReceiver из adb
У меня есть класс 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();
}
}
}
И также в манифесте:
<receiver android:name="com.whereismywifeserver.IntentReceiver" android:enabled="true">
<intent-filter android:priority="999">
<action android:name="com.whereismywifeserver.intent.TEST"/>
</intent-filter>
</receiver>
Но когда я пытаюсь отправить намерение из adb, я получаю сообщение об ошибке:
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.
Когда я создаю намерение в коде, все работает нормально. Итак, как я могу отправить намерение из adb?
Ответы
Ответ 1
Нет необходимости указывать приемник. Попробуй это:
adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb"
Дополнительные аргументы, такие как целочисленные дополнительные функции, см. В документации.
Ответ 2
Я обнаружил, что команда была неправильной, правильная команда содержит "трансляцию" вместо "start":
adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb" -n com.whereismywifeserver/.IntentReceiver
Ответ 3
Как уже отмечалось, проблема проявляется только в том случае, если дополнительная строка содержит пробелы.
Основной причиной является то, что операционная система OS/shell (то есть Windows/cmd.exe) управляет введенной командой - "
символы теряются, --es sms_body "test from adb"
становится --es sms_body test from adb
. sms_body
string дополнительно получает значение test
а остальная часть строки становится спецификатором <URI>|<PACKAGE>|<COMPONENT>
.
Чтобы избежать всего, что вы могли бы использовать:
adb shell "am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body 'test from adb' -n com.whereismywifeserver/.IntentReceiver"
или просто запустите сеанс интерактивного сеанса adb shell
и запустите команду am broadcast
изнутри.
Ответ 4
Еще одна вещь, о которой нужно помнить: Android 8 ограничивает приемники, которые могут быть зарегистрированы через манифест (например, статически)
https://developer.android.com/guide/components/broadcast-exceptions
Ответ 5
Отмечая, что моя ситуация здесь может быть полезной для кого-то,
Я должен отправить пользовательские намерения с помощью нескольких дополнительных утилит для вещательного приемника в Android P,
Подробности,
Имя получателя: com.hardian.testservice.TestBroadcastReceiver
Intent action = "com.hardian.testservice.ADD_DATA"
Дополнительные намерения,
- "text" = "test msg",
- "источник" = 1,
Выполните следующее в командной строке.
adb shell "am broadcast -a com.hardian.testservice.ADD_DATA --es text 'test msg' --es source 1 -n com.hardian.testservice/.TestBroadcastReceiver"
Надеюсь это поможет.
Ответ 6
Истинный способ отправки трансляции из команды ADB:
adb shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb"
И -a
означает ДЕЙСТВИЕ, --es
означает отправку дополнительной строки.
PS. Есть другие типы данных, которые вы можете отправить, указав различные параметры, такие как:
[-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>]
Например, вы можете отправить значение типа int:
--ei int_key 0