文章目录
- 背景
- 分析过程
- 解决方案
- 方案 1
- 方案 2
背景
跑 demo
播测,需要使用 adb
命令拉起播测 demo
,并传必要的参数将值带给我。
其中有个播放地址的值,传过来时发现值不完整,缺少了一部分。
后面发现是存在特殊字符,传参时导致了截断,故不完整。只需要特殊编码或者处理下就好。
分析过程
获取传参值的代码为:
private void testIntentData() {
System.out.println("> --- testIntentData ---");
Intent intent = getIntent();
String action = "", type = "", url = "";
if (intent != null){
System.out.println("> intent not null");
if (intent.hasExtra("action")){
action = intent.getStringExtra("action");
}
if (intent.hasExtra("type")){
type = intent.getStringExtra("type");
}
if (intent.hasExtra("url")){
url = intent.getStringExtra("url");
}
System.out.println("> action: " + action + ", type: " + type
+ ", url: " + url);
return;
}
System.out.println("> intent is null");
}
上面接收三个参数对应的值:action 参数、type 参数和 url 参数。
adb
拉起 apk
命令:
adb shell am start -n com.example.myapplication/com.example.myapplication.MainActivity -e action "pull" -e type "open" -e url "http://www.baidu.com?name=zouqi"
命令说明:
adb shell am start -n [包名]/[启动类名] -e [参数key] [参数值] ...
调用如下:
输出结果:
可以看到,通过 adb
命令传参的参数值都不存在特殊字符,故成功的获取到了传进来的所有参数的值。
如果我们的传参的 url
参数值变为 http://www.baidu.com?name=imxiaoqi&age=27&no=yh9527
。
调用:
输出结果:
这里发现 url
的值被截断了,这是因为 url
参数值中存在特殊字符 &
。
adb shell
相当于是在 linux shell
环境下运行的,而 &
符号是 shell
中的特殊字符,表示后台运行,因此会出现截断的情况。
解决方案
方案 1
使用命令:
adb shell am start -n com.example.myapplication/com.example.myapplication.MainActivity -e action "pull" -e type "open" -e url "http://www.baidu.com?name=imxiaoqi\&age=27\&no=yh9527"
这里只是对特殊字符 &
做了简单的处理,至于其他特殊字符同学们可以自己去实践,这里不推荐采用该方案,因为可能有些参数值的特殊字符单纯加 \
无法生效。
方案 2
将参数值进行 urlEncode
编码后传递,代码中获取到参数值后,再进行解码操作即可。
推荐编码工具网站:URL编码/解码
修改代码:
private void testIntentData() {
System.out.println("> --- testIntentData ---");
Intent intent = getIntent();
String action = "", type = "", url = "";
if (intent != null){
System.out.println("> intent not null");
if (intent.hasExtra("action")){
action = intent.getStringExtra("action");
}
if (intent.hasExtra("type")){
type = intent.getStringExtra("type");
}
if (intent.hasExtra("url")){
url = intent.getStringExtra("url");
System.out.println("> 编码 url: " + url);
url = URLDecoder.decode(url);
System.out.println("> 解码 url:" + url);
}
System.out.println("> action: " + action + ", type: " + type
+ ", url: " + url);
return;
}
System.out.println("> intent is null");
}
http://www.baidu.com?name=imxiaoqi&age=27&no=yh9527
编码后的值
http%3a%2f%2fwww.baidu.com%3fname%3dimxiaoqi%26age%3d27%26no%3dyh9527
如下图:
输入命令如下:
输出结果:
推荐解决方案 2 ,解决几乎所有情况!
技术永不眠!我们下期见!