在网页中调启Android应用

前几天总结了在app中调用其他应用的方法,这一次收集了在网页Html中调Android应用的解决方案。总的思路是,通过url连接调用app中有对应标记的Activity,通过url的参数传递数据,通过设置超时时间来判断是否安装了app.

一、Html中打开app

 首先在AndroidManifest.xml中配置被打开的Activity
   
   
<activity android:name = ".MainActivity" >
<intent-filter>
//程序主入口(必须)
<action android:name = "android.intent.action.MAIN" />
//设置桌面图标
<category android:name = "android.intent.category.LAUNCHER" />
//动作:和 VIEW_ACTION 相同,是在数据上执行的标准动作。(必须)
<action android:name = "android.intent.action.VIEW" />
//类别:如果 activity 是对数据执行确省动作(点击, center press)的一个选项,需要设置这个类别。(必须)
<category android:name = "android.intent.category.DEFAULT" />
//类别:能够被浏览器安全使用的 activities 必须支持这个类别。(必须)
<category android:name = "android.intent.category.BROWSABLE" />
//识别标示
<data
android:host = "wankun.com"
android:scheme = "hansheng" />
</intent-filter>
</activity>
其中
   1、android.intent.action.MAIN 不能忘记掉,是设置该Activity可以作为程序入口单独打开的标示,不然会报错
   2、识别标示 中host是主机地址,scheme可以理解为意图协议。所以对应的网页中的路径是“ hansheng://wankun.com/”


所以html这样写就可以调用起app中对应的Activity了
   
   
<!DOCTYPE html>
<html>
<head lang = "en" >
<meta charset = "UTF-8" >
<title> Html中打开app </title>
</head>
<body>
<a href = "hansheng://wankun.com/" > 打开app </a><br/>
</body>
</html>


二、传递参数

网页中传递参数的方式 和普通的url传参相似,直接加载url之后,如 :hansheng://wankun.com/ ?param1=0&param2=aaa

对已的Activity中做参数接收,和普通的参数接收相似。
   
   
Uri uri = getIntent (). getData ();  
String test1 = uri . getQueryParameter ( "param1" );  
String test2 = uri . getQueryParameter ( "param2" );
Log . e ( ">>>>>>>>>" , test1 + test2 );
至于复杂参数的传递,可以用json 对象来处理,


三、如果没有安装该app怎么办

html中其实是无法判断应用是否安装,除非在webview中通过js bridge,这里通过一种方式达到此目的。
 window.setTimeout 设置。即在html中设置 延迟动作 ,在延时时间之内没有得到app的响应,说明没有安装app,
   
   
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Html中打开app</title>
</head>
<body>
 
 
<a id="openApp">打开app</a><br/>
<script type="text/javascript">
document.getElementById('openApp').onclick = function(e){
// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP
var ifr = document.createElement('iframe');
ifr.src = 'hansheng://wankun.com/?param1=0&param2=aaa';
ifr.style.display = 'none';
document.body.appendChild(ifr);
window.setTimeout(function(){
//有人说如果跳转成功,下面的方法不会执行,但是在手机浏览器上测试,不管跳转是否成功,下面的方法还是会执行,哭
location.href="https://www.baidu.com/";//如果超时就跳转到app下载页
document.body.removeChild(ifr);
},500)
}
 
</script>
</body>
</html>
这里并不能真正实现判断是否有没有安装app,上面的示例中不管是否安装app都会跳转到百度(一般是跳转到下载界面)。如果大神知道更好的解决方法,请留言给我,谢谢
 




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这种情况通常是由于浏览器的同源策略(Same-Origin Policy)引起的,同一个网页的JavaScript代码只能访问相同协议、相同域名、相同端口的资源。而跨域请求则会被浏览器拦截,导致无法正常访问。 在使用 `apifox` 用接口时,`apifox` 发起的请求和你的网页发起的请求是不同的,因此可能会被拦截。你可以在浏览器安装一个跨域插件(如CORS插件),或者在服务器端设置跨域请求的响应头来解决这个问题。 如果你使用的是 `apifox` 提供的代码模板,你可以在请求添加 `dataType: 'jsonp'` 参数来使用 JSONP(JSON with Padding)协议进行跨域请求。JSONP 是一种通过在请求添加回函数名来绕过同源策略的方法,不过需要服务器端支持。 另外,如果你的网页和接口服务在同一个域名下,但是端口不同,也会被浏览器视为跨域请求。这种情况下,你可以在服务器端设置响应头 `Access-Control-Allow-Origin`,允许来自其他端口的跨域请求。例如,在 Node.js 可以使用 `cors` 模块来实现: ```javascript const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors({ origin: 'http://localhost:8080' })); // 处理请求的代码 app.get('/api/getData', (req, res) => { // 处理请求的代码 }); app.listen(8100, () => { console.log('Server running on http://localhost:8100'); }); ``` 这样就可以允许来自 `http://localhost:8080` 的跨域请求了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值