
为了实现这个功能可折腾了我好久,先上一份代码,经楼主验证是绝对可以用的而且也比较清晰的代码!(ps:还是先剧透下吧,第三方大部分浏览器无法成功。)
点击浏览器中的URL链接,启动特定的App。
首先做成HTML的页面,页面内容格式如下:
<a href="[scheme]://[host]/[path][query]">启动应用程序</a>
这一句就可以了。
各个项目含义如下所示:
scheme:判别启动的App。 ※详细后述
host:适当记述
path:传值时必须的key ※没有也可以
query:获取值的Key和Value ※没有也可以
作为测试好好写了一下,如下:
<a href="myapp://jpapp/openwithname=zhangsan&age=26">启动应用程序</a>
接下来是Android端。
首先在AndroidManifestxml的MAIN Activity下追加以下内容。(启动Activity时给予)
※必须添加项
<intent-filter>
<action android:name="androidintentactionVIEW"/>
<category android:name="androidintentcategoryDEFAULT" />
<category android:name="androidintentcategoryBROWSABLE" />
<data android:scheme="myapp" android:host="jpapp" android:pathPrefix="/openwith"/>
</intent-filter>
HTML记述的内容加入<data …/>。
其中必须的内容仅scheme,没有其他内容app也能启动。
※注意事项:intent-filter的内容androidintentactionMAIN和 androidintentcategoryLAUNCHER这2个,不能与这次追加的内容混合。
所以,如果加入了同一个Activity,请按以下这样做,否则会导致应用图标在桌面消失等问题。
复制代码
<intent-filter>
<action android:name="androidintentactionMAIN"/>
<category android:name="androidintentcategoryLAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="androidintentactionVIEW"/>
<category android:name="androidintentcategoryDEFAULT" />
<category android:name="androidintentcategoryBROWSABLE" />
<data android:scheme="myapp" android:host="jpapp" android:pathPrefix="/openwith"/>
</intent-filter>
复制代码
这样的话,没有问题。
接下来在Activity中需要取值的地方添加以下代码,我是直接写在OnCreate函数里的:
Intent i_getvalue = getIntent();
String action = i_getvaluegetAction();
if(IntentACTION_VIEWequals(action)){
Uri uri = i_getvaluegetData();
if(uri != null){
String name = urigetQueryParameter("name");
String age= urigetQueryParameter("age");
}
}
这样就能获取到URL传递过来的值了。
需求很简单,通过Html页面中的一个超链接打开我们的App,实现也很简单。
网页:
scheme:代表Scheme的协议名称(必要)
host和path可选择添加
query:代表URL传递的数据
简单的写一个页面:
接卸来开始配置AndroidManifestxml文件,在有 <action android:name="androidintentactionMAIN" /> 的actvity配置下新增一个filter,注意是新增一个filter,例如:
这里注意scheme里参数和我们在html页面里的对应关系,不要弄错,多了,我们在a标签里还传递了参数,接受也很简单,例如:
写完,我们来看看效果:
成功实现,控制台的日志也能看到我们的参数确实传递过来了:
就这样,记录下来,收工。
很多时候我们的应用在使用微信分享内容之后,希望其他用户点击该分享内容能够跳转到我们的App,以实现闭环,这样的分享才是最有价值的。这种需求涉及到不同应用之间的交互,虽然微信提供了分享SDK,但仍然有不少限制,现在总结两种在Android平台上初步认为可行的方案:
1分享网页,从分享的网页跳转回原App。
2分享WXAppExtendObject类型的数据,且只能分享给好友,好友从聊天列表点击收到的分享内容可以直接跳转第三方App(前提是好友手机上已经安装了该App)。
下面来详细说明两个方案,由于是在项目中实测的,为了隐私及行文方便,假设我们的应用的名字为MyApp,效果截图也就不再展示。
方案一:
从WebView(该WebView从属于另一个App,并非我们自己的App)跳转到MyApp的某个界面(这里以跳转到MyApp的Acticity A为例)。具体的实现逻辑如下:
(1)该WebView显示的网页内容只是一个超链接,自定义了一个scheme=myapp://,后边可以附加一些参数,如果需要从网页向App传值的话。
<html>
<head>
<meta >
1、自定义URL Scheme:
创建一个activity并加上一个<intent-filter>(如果该activity是包含其他<intent-filter>,则需新建一个<intenf-filter>,不能在原有filter上添加),内容为:
<action android:name="androidintentactionVIEW"/><!-- 若删除,使用startActivity启动androidcontentActivityNotFoundException,使用HTMLViewer启动找不到网页-->
<category android:name="androidintentcategoryBROWSABLE"/><!-- 若删除,使用startActivity启动ok,使用HTMLViewer启动找不到网页 -->
<category android:name="androidintentcategoryDEFAULT"/><!-- 若删除,使用startActivity启动androidcontentActivityNotFoundException,使用HTMLViewer启动找不到网页-->
<data android:scheme="myapp"/><!-- scheme的值可自定义 -->
2、通过URL Scheme启动Android应用
方式一:通过代码访问:Intent intent = new Intent();
/parse的参数值说明如下
只写myapp,启动androidcontentActivityNotFoundException
写myapp://12,成功
写myapp://dasd=ad,成功
/
intentsetData(Uriparse("myapp://12"));
startActivity(intent);
方式二:通过网页访问:
/href的值说明如下
只写myapp,找不到网页
写myapp://12,成功
写myapp://dasd=ad,成功
/
<html xmlns=">
点击浏览器中的URL链接,启动特定的App。
首先做成HTML的页面,页面内容格式如下:
<a href="[scheme]://[host]/[path][query]">启动应用程序</a>
这一句就可以了。
各个项目含义如下所示:
scheme:判别启动的App。 ※详细后述
host:适当记述
path:传值时必须的key ※没有也可以
query:获取值的Key和Value ※没有也可以
作为测试好好写了一下,如下:
<a href="myapp://jpapp/openwithname=zhangsan&age=26">启动应用程序</a>
接下来是Android端。
首先在AndroidManifestxml的MAIN Activity下追加以下内容。(启动Activity时给予)
※必须添加项
<intent-filter>
<action android:name="androidintentactionVIEW"/>
<category android:name="androidintentcategoryDEFAULT" />
<category android:name="androidintentcategoryBROWSABLE" />
<data android:scheme="myapp" android:host="jpapp" android:pathPrefix="/openwith"/>
</intent-filter>
HTML记述的内容加入<data …/>。
其中必须的内容仅scheme,没有其他内容app也能启动。
※注意事项:intent-filter的内容androidintentactionMAIN和 androidintentcategoryLAUNCHER这2个,不能与这次追加的内容混合。
所以,如果加入了同一个Activity,请按以下这样做,否则会导致应用图标在桌面消失等问题。
<intent-filter>
<action android:name="androidintentactionMAIN"/>
<category android:name="androidintentcategoryLAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="androidintentactionVIEW"/>
<category android:name="androidintentcategoryDEFAULT" />
<category android:name="androidintentcategoryBROWSABLE" />
<data android:scheme="myapp" android:host="jpapp" android:pathPrefix="/openwith"/>
</intent-filter>
这样的话,没有问题。
接下来在Activity中需要取值的地方添加以下代码,我是直接写在OnCreate函数里的:
Intent i_getvalue = getIntent();
String action = i_getvaluegetAction();
if(IntentACTION_VIEWequals(action)){
Uri uri = i_getvaluegetData();
if(uri != null){
String name = urigetQueryParameter("name");
String age= urigetQueryParameter("age");
}
}
这样就能获取到URL传递过来的值了。
可以说是五个吧: 1 Activity 2 Service 3 Broadcast Receiver 4 Content Provider 5 Intent c) 该方法启动的Service,可以通过Context对象调用stopService来关闭,也可以通过Service自身调用stopSelf()或stopSelfResult()来关闭,关闭之前
Google从Android N上开始把签名方法改成了scheme V2, 在P上又改成了scheme V3 在大环境里面编译是用的V3方法,但是在studio上目前还不支持 scheme V3 签名。所以如果shareUID的话,可能会出现签名不一致问题。
V2 和V1的差别是V2是对整个zip包进行签名,而且在zip包中增加了一个apk signature block,里面保存签名信息。
v3 是在v2的基础上增加了,certificate rotation or APK key rotation, 就是说增加了族系的概念,可以在原有的证书或者key的基础上做一个变化,变成新的key,用新的key签名,也是有效的。
详细签名说明可以参考下面两个文档。
>
以上就是关于怎么在android实现通过浏览器点击链接打开apk全部的内容,包括:怎么在android实现通过浏览器点击链接打开apk、Android 从浏览器链接打开App、android怎么把其他app的内容分享到自己的app里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)