2012-11-28 5 views
22

UtilizzandoCome si inseriscono gli e commerciali negli URL per l'inizio della shell adb?

$ adb shell am start some://url 

posso lanciare gli URL utilizzando Gestione attività. Tuttavia, se includo più parametri URL, tutti tranne il primo parametro vengono eliminati.

Esempio:

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

Ritorni:

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

e param2 scompare come nulla dopo una e commerciale viene ignorato. Mi chiedo se c'è qualche carattere di codifica/escape per lo & che impedirà questo.

risposta

29

uso di caratteri di escape \:

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

Purtroppo con gli strumenti della piattaforma di versione 21 c'è un bug in cui l'URL otterrà troncato dopo il primo e commerciale, anche se lo sfuggi. Consulta questo problema 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

La soluzione alternativa è di inviare: '$ adb shell am start" http://www.example.com?param1=1%26param2=2 "' –

1

ho già postato una soluzione qui: https://code.google.com/p/android/issues/detail?id=76026

Quindi, ecco la ricetta che coinvolge strumentazione.
Registrare un BroadcastReceiver all'interno della strumentazione che ascolta l'azione com.example.action.VIEW.

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

Sostituire commerciale con% 26 (uso può sostituirlo con tutto quello che vuoi) e inviare un com.example.action.VIEW intento.
Una volta ricevuto l'intento BroadcastReceiver converte% 26 in Ampersand e invia un nuovo intent con l'azione desiderata alla tua 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); 
} 

Fondamentalmente funge da proxy BroadcastReceiver.

4

La soluzione accettata non funziona a causa di un bug negli strumenti di build di Android che è possibile monitorare qui: https://code.google.com/p/android/issues/detail?id=76026. Una soluzione è il qui sotto:

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 

di integrarlo in Gradle è possibile utilizzare l'istruzione commandLine

commandLine "bash","-c","echo ..." 
+0

Grazie per questo! Questo è il modo corretto di testare la trasmissione INSTALL_REFERRER in questo momento. – scana

2

Citazione il comando am...!
qualcosa come il seguente dovrebbe funzionare (se non lo fa, prova a doppia citazione):

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