Как включить амперсанды в URL-адресах для запуска adb shell?

С помощью

$ adb shell am start some://url 

Я могу запускать URL-адреса, используя диспетчер активности. Однако, если я включаю несколько параметров URL, все, кроме первого параметра, удаляются.

Пример:

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

Возвращает:

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

И param2 исчезает как что-либо после того, как амперсанд проигнорируется. Мне интересно, есть ли какой-нибудь символ кодирования / escape-кода для &, который предотвратит это.

Solutions Collecting From Web of "Как включить амперсанды в URL-адресах для запуска adb shell?"

Использовать escape-символ \ :

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

Принятое решение не работает из-за ошибки в инструментах сборки Android, которые вы можете отслеживать здесь: https://code.google.com/p/android/issues/detail?id=76026 . Обходной путь:

 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 

Чтобы интегрировать его в gradle, вы можете использовать оператор commandLine

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

Цитировать am... команда!
Что-то вроде следующего должно работать (если это не так, попробуйте двойную кавычку):

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

Я уже разместил обходное решение здесь: https://code.google.com/p/android/issues/detail?id=76026

Итак, вот рецепт, который включает в себя инструменты.
Зарегистрируйте BroadcastReceiver в инструментах, которые прослушивают действие 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); 

Замените амперсанд% 26 (использование может заменить его на что угодно) и отправьте намерение com.example.action.VIEW.
После получения намерения BroadcastReceiver конвертирует% 26 обратно в амперсанд и отправляет новое намерение с желаемым действием в ваше приложение.

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

В основном он действует как прокси-сервер BroadcastReceiver.