2012-11-28 3 views
22

MitWie nehmen Sie kaufmännische Und-Zeichen in URLs für adb-Shell am Start?

$ adb shell am start some://url 

ich URLs Aktivitätsmanager starten können. Wenn ich jedoch mehrere URL-Parameter einschließe, werden alle außer dem ersten Parameter entfernt.

Beispiel:

$ adb shell am start http://www.example.com?param1=1&param2=2 

Returns:

$ Starting: Intent { act=android.intent.action.VIEW dat=http://www.example.com?param1=1 } 

und param2 verschwindet alles nach einem kaufmännischen ignoriert wird. Ich frage mich, ob es eine Codierung/Escape-Zeichen für die &, die dies verhindern wird.

Antwort

29

Verwendung Escape-Zeichen \:

$ adb shell am start "http://www.example.com?param1=1\&param2=2" 
+8

Leider mit Plattform-Tool Version 21 gibt es einen Bug, bei dem die URL nach dem ersten Et-Zeichen erhält abgeschnitten wird, auch wenn Du entkommst es. Bitte lesen Sie diese Ausgabe https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=76026 – bumbobway

+3

Die Problemumgehung ist zu senden: '$ adb shell am start" http://www.example.com?param1=1%26param2=2 "' –

1

Ich habe bereits gebucht eine Abhilfe hier: https://code.google.com/p/android/issues/detail?id=76026

So, hier das Rezept, das Instrumentierung beinhaltet ist.
Registrieren Sie einen BroadcastReceiver innerhalb der Instrumentierung, die die Aktion com.example.action.VIEW abgehört.

IntentFilter intentFilter = new IntentFilter("com.example.action.VIEW"); 
intentFilter.addDataScheme("myschema"); 
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE); 
Context.registerReceiver(new MyBroadcastReceiver(), intentFilter); 

ersetzen Ampersand mit% 26 (Verwendung kann es ersetzen, was Sie wollen) und eine Absicht com.example.action.VIEW senden.
Sobald der BroadcastReceiver empfangen wurde, konvertiert er% 26 zurück in kaufmännisches Und sendet eine neue Absicht mit der gewünschten Aktion an Ihre App.

public final void onReceive(final Context context, final Intent intent) { 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.setData(Uri.parse(intent.getDataString().replaceAll("%26", "&"))); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(intent); 
} 

Grundsätzlich fungiert es als BroadcastReceiver-Proxy.

4

Die akzeptierte Lösung funktioniert nicht wegen eines Fehlers in den android Build-Tools, die Sie hier verfolgen können: https://code.google.com/p/android/issues/detail?id=76026. Eine Abhilfe ist die folgende Liste:

echo 'am broadcast -a com.android.vending.INSTALL_REFERRER -n <your package>/<broadcast-receiver> --es "referrer" "utm_source=test_source&utm_medium=test_medium&utm_term=test_term&utm_content=test_content&utm_campaign=test_name";exit'|adb shell 

Um es in gradle zu integrieren Sie die Kommandozeile Anweisung

können
commandLine "bash","-c","echo ..." 
+0

Vielen Dank dafür! Dies ist der richtige Weg, um die INSTALL_REFERRER-Übertragung jetzt zu testen. – scana

2

Quote der am... Befehl!
etwas wie die folgenden funktionieren soll (wenn es nicht, doppelte Anführungszeichen nicht versuchen):

adb shell 'am start http://www.example.com?param1=1&param2=2' 
Verwandte Themen