您的位置:首页 > 移动开发

浏览器启动APP

2017-05-16 15:44 162 查看
#1 需求

点击一个url链接,会启动手机中安装的app,可以通过url传递参数,如果本机没有安装app,跳转下载链接;兼容第三方浏览器

#3 原理:

浏览器中执行一个带特定标记(scheme)的url,本地app在Activity的声明中做相同配置即可

#4 实现
1)html文件:text.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<a href="https://www.baidu.com/?tn=96180901_hao_pg">跳转百度</a>

<a href="dxzq://106.37.173.33:8060/jgone?a=b">启动应用程序</a>
</body>
</html>

2)android实现:
manifest.xml配置:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="ahttps" android:host="106.37.173.33" android:pathPattern="/jgone/app-debug.apk"/>
</intent-filter>
</activity>

代码中获取传递的参数:

Uri data = getIntent().getData();

if(data != null){

String scheme = data.getScheme(); // "http"

Log.i(TAG,">>>> scheme = "+scheme);

String host = data.getHost(); // "twitter.com"

Log.i(TAG,">>>> host = "+host);

int port = data.getPort();

Log.i(TAG,">>>> port = "+port);

List<String> params = data.getPathSegments();

for(int i = 0;i<params.size();i++){

Log.i(TAG,">>>> position ="+i+" param = "+params.get(i));

}

String name = data.getQueryParameter("a");//?a=b 参数

Log.i(TAG,">>>> Parameter name="+name);

}

#5 三方浏览器的兼容问题:

UC浏览器,如果你使用了自己的scheme,而不是http的话,uc会默认在你的scheme前面添加http://。这太坑爹了。其他浏览器没看是不是同样的情况。发现这个问题后我就试着把自己的scheme换成http。然后满怀期待的又跑了一遍,结果还是坑爹了。所以我想会不会是第三方浏览器对url做了处理。到这里,我也无可奈何了。我测试了UC,猎豹,欧朋,这3个都不支持。系统自带的和谷歌浏览器是支持的。

最后再补充个线索吧,在浏览器里搜索百度应用。进了他们的页面后,他们是可以实现在各种浏览器启动已经安装好的本地app的。看到这个后我就看了下他们页面的源码。

在这里他们页面添加了个data-sentintent的标签,看到这里,应该能确定第三方浏览器应该是默认都不支持发intent的,只能自己起一个。根据前端说,这个标签应该是自定义的。我们前端看源码的时候发现是这样的

所以最后的结果应该是百度这边是起了个端口,然后在应用里启用了一个服务,来监听这个端口,来获取这个intent。大概就这个思路了。不过楼主没有实际去操作。项目时间紧,太麻烦了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息