¿Cómo se incluyen los "ampersand" en las URL de adb shell am start?

Utilizando

$ adb shell am start some://url 

Puedo lanzar URL usando el gestor de actividades. Sin embargo, si incluyo varios parámetros de URL, todos excepto el primer parámetro se eliminan.

Ejemplo:

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

Devoluciones:

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

Y param2 desaparece como cualquier cosa después de que un esperma sea ignorado. Me pregunto si hay algún carácter de codificación / escape para el & que evitará esto.

Use el carácter de escape \ :

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

La solución aceptada no funciona debido a un error en las herramientas de compilación android que puede realizar un seguimiento aquí: https://code.google.com/p/android/issues/detail?id=76026 . Una solución es la siguiente:

 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 

Para integrarlo en gradle puede utilizar la instrucción commandLine

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

Citar el comando am... !
Algo como lo siguiente debería funcionar (si no lo hace, intente una comilla doble):

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

Ya he publicado una solución provisional aquí: https://code.google.com/p/android/issues/detail?id=76026

Así que, aquí está la receta que implica la instrumentación.
Registre un BroadcastReceiver dentro de la instrumentación que escucha la acción 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); 

Sustituya el & comercial con% 26 (el uso puede substituirlo con cualquier cosa que usted quiere) y envía un com.example.action.VIEW intento.
Una vez recibida la intención BroadcastReceiver convierte% 26 de nuevo a esperma y envía una nueva intención con la acción deseada a su aplicación.

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

Básicamente actúa como un proxy BroadcastReceiver.

  • ¿Cómo se pueden extraer los datos (privados) de la propia aplicación de Android?
  • ¿Cómo puedo saber si una actividad de Android ha finalizado desde un comando externo de adb?
  • ¿Cómo depurar un broadcastreceiver?
  • Cómo usar el mono androide
  • Cómo definir y utilizar una propiedad del sistema en la prueba de instrumentación de Android?
  • Pipe en `adb shell`
  • Cómo iniciar servidor de adb sobre tcp mediante programación
  • Java.lang.SecurityException: Permiso Denial: Intención inicial {act = android.intent.action.MAIN cat =
  • Adb kill-server no responde?
  • Adb: error al cargar bibliotecas compartidas: libncurses.so.5: no se puede abrir archivo de objeto compartido: No existe tal archivo o directorio
  • Introducción de shell ADB dentro de un directorio específico en el dispositivo conectado utilizando sólo una sola línea de código de terminal
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.