web-dev-qa-db-ja.com

adbからBroadcastReceiverにインテントを送信する

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からインテントを送信できますか?

37
user2106655

受信者を指定する必要はありません。代わりにadbを使用できます。

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

整数の追加などの引数については、 documentation を参照してください。

72
Zohra Khan

コマンドが間違っていることがわかりました。正しいコマンドには「開始」の代わりに「ブロードキャスト」が含まれています。

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

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

留意すべきもう1つのこと:Android 8は、マニフェストを介して登録できるレシーバーを制限します(静的になど)

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

3
Yang

私は同じ問題を抱えていて、余分なスペースをエスケープする必要があることがわかりました:

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

したがって、「adbからテストする」の代わりに、「test\from\adb」にする必要があります

2
melbic

多くの人がすでに気づいているように、余分な文字列に空白が含まれている場合にのみ、問題が現れます。

根本的な原因は、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コマンドを実行します。

2
Alex P.

ここに私の状況を書き留めておけば、誰かに役立つかもしれませんが、

Android P、

詳細は、

受信名: com.hardian.testservice.TestBroadcastReceiver

意図action = "com.hardian.testservice.ADD_DATA"

意図的なエキストラは、

  1. "text" = "テストメッセージ"、
  2. 「ソース」= 1

コマンドラインで次を実行します。

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

お役に立てれば。

0
Hardian