webentwicklung-frage-antwort-db.com.de

Sendeabsicht an BroadcastReceiver von adb

Ich habe eine BroadcastReceiver-Klasse:

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();
        }
    }
}

Und auch im Manifest:

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

Wenn ich versuche, Absichten von adb zu senden, erhalte ich eine Fehlermeldung:

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.

Wenn ich eine Absicht im Code erstelle, funktioniert alles gut. Wie kann ich also eine Absicht von adb senden?

34
user2106655

Sie müssen keinen Empfänger angeben. Sie können stattdessen Adb verwenden.

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

Weitere Argumente wie Integer-Extras finden Sie in der Dokumentation .

69
Zohra Khan

Ich habe festgestellt, dass der Befehl falsch war, der korrekte Befehl enthält "Broadcast" anstelle von "Start":

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

Ich hatte das gleiche Problem und stellte fest, dass Sie Leerzeichen im Extra entkommen müssen:

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

Statt "test from adb" sollte es also "test\from\adb" sein.

2
melbic

Wie viele bereits bemerkt haben, tritt das Problem nur dann auf, wenn die zusätzliche Zeichenfolge Leerzeichen enthält.

Die Hauptursache ist, dass die Host-OS/Shell von OP (d. H. Windows/cmd.exe) den eingegebenen Befehl verändert. Die "-Zeichen gehen verloren, --es sms_body "test from adb" wird zu --es sms_body test from adb. Dies führt dazu, dass sms_body-Zeichenfolge extra der Wert von test zugewiesen wird und der Rest der Zeichenfolge zum <URI>|<PACKAGE>|<COMPONENT>-Bezeichner wird.

Um alles zu vermeiden, was Sie verwenden könnten:

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

oder starten Sie einfach die interaktive adb Shell-Sitzung und führen Sie den am broadcast-Befehl von innen aus.

2
Alex P.

Eine andere Sache, die zu beachten ist: Android 8 begrenzt die Empfänger, die über ein Manifest registriert werden können (z. B. statisch)

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

2
Yang

Die wahre Methode zum Senden einer Übertragung von einem ADB-Befehl lautet:

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

Und -a bedeutetACTION, --es bedeutet das Senden eines String extra. 


PS. Es gibt andere Datentypen , die Sie senden können, indem Sie verschiedene Parameter angeben:

[-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>]

Sie können beispielsweise einen int-Wert senden, indem Sie

--ei int_key 0
1
CalvinChe

Meine Situation hier festzuhalten, kann für jemanden nützlich sein,

Ich muss eine benutzerdefinierte Absicht mit mehreren absichtlichen Extras an einen Rundfunkempfänger in Android P senden.

Die Details sind

Empfängername: com.hardian.testservice.TestBroadcastReceiver

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

vorsatz Extras sind, 

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

Führen Sie die folgenden Anweisungen in der Befehlszeile aus.

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

Hoffe das hilft.

0
Hardian