Ответ 1
использовать escape-символ \
:
$ adb shell am start "http://www.example.com?param1=1\¶m2=2"
Использование
$ 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.