Подтвердить что ты не робот

Как включить амперсанды в 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 для этого, и это предотвратит это.

4b9b3361

Ответ 1

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

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

Ответ 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 ..."

Ответ 3

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

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

Ответ 4

Я уже разместил обходное решение здесь: 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.