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からインテントを送信できますか?
受信者を指定する必要はありません。代わりにadbを使用できます。
adb Shell am broadcast -a com.whereismywifeserver.intent.TEST
--es sms_body "test from adb"
整数の追加などの引数については、 documentation を参照してください。
コマンドが間違っていることがわかりました。正しいコマンドには「開始」の代わりに「ブロードキャスト」が含まれています。
adb Shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb" -n com.whereismywifeserver/.IntentReceiver
ADBコマンドからブロードキャストを送信する真の方法は次のとおりです。
adb Shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test from adb"
そして、-a
は[〜#〜] action [〜#〜]、--es
は、String extraを送信することを意味します。
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
留意すべきもう1つのこと:Android 8は、マニフェストを介して登録できるレシーバーを制限します(静的になど)
https://developer.Android.com/guide/components/broadcast-exceptions
私は同じ問題を抱えていて、余分なスペースをエスケープする必要があることがわかりました:
adb Shell am broadcast -a com.whereismywifeserver.intent.TEST --es sms_body "test\ from\ adb"
したがって、「adbからテストする」の代わりに、「test\from\adb」にする必要があります
多くの人がすでに気づいているように、余分な文字列に空白が含まれている場合にのみ、問題が現れます。
根本的な原因は、OPのホストOS/Shell(つまり、Windows/cmd.exe)が入力されたコマンドを破壊することです-"
文字が失われ、--es sms_body "test from adb"
が--es sms_body test from adb
になります。これにより、sms_body
文字列の追加が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
コマンドを実行します。
ここに私の状況を書き留めておけば、誰かに役立つかもしれませんが、
Android P、
詳細は、
受信名: com.hardian.testservice.TestBroadcastReceiver
意図action = "com.hardian.testservice.ADD_DATA"
意図的なエキストラは、
コマンドラインで次を実行します。
adb Shell "am broadcast -a com.hardian.testservice.ADD_DATA --es text 'test msg' --es source 1 -n com.hardian.testservice/.TestBroadcastReceiver"
お役に立てれば。