你如何在adb shell的URL中加入&符号?

时间:2012-11-28 22:51:27

标签: android adb

使用

$ adb shell am start some://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在&符号被忽略之后消失。我想知道&是否有一些编码/转义字符。这将阻止这种情况。

5 个答案:

答案 0 :(得分:39)

使用转义字符\

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

答案 1 :(得分:5)

由于您可以在此处跟踪的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 ..."

答案 2 :(得分:5)

以下格式似乎有效。请注意引号格式' "

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

答案 3 :(得分:1)

我已在此处发布了一个解决方法:https://code.google.com/p/android/issues/detail?id=76026

所以,这是涉及仪器的配方 在监听动作com.example.action.VIEW。

的检测中注册BroadcastReceiver
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代理。

答案 4 :(得分:1)

引用am...命令!
以下内容应该有效(如果不是,请尝试双引号):

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