С помощью
$ adb shell am start some://url
Я могу запускать URL-адреса, используя диспетчер активности. Однако, если я включаю несколько параметров URL, все, кроме первого параметра, удаляются.
Пример:
$ adb shell am start http://www.example.com?param1=1¶m2=2
Возвращает:
$ Starting: Intent { act=android.intent.action.VIEW dat=http://www.example.com?param1=1 }
И param2 исчезает как что-либо после того, как амперсанд проигнорируется. Мне интересно, есть ли какой-нибудь символ кодирования / escape-кода для &, который предотвратит это.
Использовать escape-символ \
:
$ adb shell am start "http://www.example.com?param1=1\¶m2=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¶m2=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.