android/ios js 启动apk

1.在移动设备访问某个连接时时,如果本地安装了其应用客户端,则浏览器会调用本地客户端,没有安装则会跳转到下载页面,提示安装。刚好有这样的需求,网上参考了其他人的实现,大部分都是关于APK和本地js交互,相关资料可以参考如下,要注意的是手机qq浏览器不支持iframe,那么可以推测不支持iframe的浏览器都不行的。

web端代码如下

<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>APK下载</title>
        <script type="text/javascript" src="${ctx}/static/script/base/jquery-1.11.1.min.js"></script>

   <script type="text/javascript">
   var browser = {
    versions: function () {
        var u = navigator.userAgent, app = navigator.appVersion;
        return {         //移动终端浏览器版本信息
            trident: u.indexOf('Trident') > -1, //IE内核
            presto: u.indexOf('Presto') > -1, //opera内核
            webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
            gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
            mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
            ios: !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
            android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器
            iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器
            iPad: u.indexOf('iPad') > -1, //是否iPad
            webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部
        };
    }(),
    language: (navigator.browserLanguage || navigator.language).toLowerCase()
}
    $(function(){
     open();
    });
    
      function open(){
      
      if (browser.versions.mobile) {//判断是否是移动设备打开。browser代码在下面
        var ua = navigator.userAgent.toLowerCase();//获取判断用的对象
        
        if (ua.match(/QQ/i) == "qq") {
           window.location="http://edu.adc.ah.chinamobile.com/cms3/ahappdown/index.html";
           return;
        }
        }else {//否则就是PC浏览器打开
        }
    
        
        //判断是否是android设备浏览器    if (navigator.userAgent.match(/android/i)) {
    if (navigator.userAgent.match(/android/i)) {
        
      document.getElementById('openApp').onclick = function(e) {
            // 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
            // 否则打开a标签的href链接
            var ifrSrc = 'educloud://anhuiwx.app/hejiaoyuapp';
            if (!ifrSrc) {
                return;
            }
            
             $("#bodyId").append("<iframe id='ifr' style='display:none;'></iframe>");
             $("#ifr").attr("src",ifrSrc);
            setTimeout(function() {
                 $("#ifr").remove();

            }, 1000);

        };
        if (document.all) {
            document.getElementById('openApp').click();
        }
        // 其它浏览器
        else {
            var e = document.createEvent("MouseEvents");
            e.initEvent("click", true, true);
            document.getElementById("openApp").dispatchEvent(e);
        }
     }
     else if(navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)){ //ios判断
       document.getElementById('openApp').onclick = function(e) {
            // 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
            // 否则打开a标签的href链接
            var ifrSrc = 'andedu://andedu';
            if (!ifrSrc) {
                return;
            }
            
             $("#bodyId").append("<iframe id='ifr' style='display:none;'></iframe>");
             $("#ifr").attr("src",ifrSrc);
            setTimeout(function() {
                 $("#ifr").remove();

            }, 1000);

        };
        if (document.all) {
            document.getElementById('openApp').click();
        }
        // 其它浏览器
        else {
            var e = document.createEvent("MouseEvents");
            e.initEvent("click", true, true);
            document.getElementById("openApp").dispatchEvent(e);
        }  
        }
    }
        
</script>
<body id="bodyId">
<a href="http://edu.adc.ah.chinamobile.com/cms3/ahappdown/index.html" id="openApp" style="display: none">APK客户端下载链接</a>

</body>

andriod端配置如下

在android应用中application的详细配置实例:

在MainActivity增加了

 

"android.intent.action.VIEW"/>

"android.intent.category.DEFAULT"/>

"android.intent.category.BROWSABLE"/>

"testjs"/>

 

过滤器。

 

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

 

android:name="demo.testjs.MainActivity"

android:label="@string/app_name">

 

"android.intent.action.MAIN"/>

"android.intent.category.LAUNCHER"/>

 

 

"android.intent.action.VIEW"/>

"android.intent.category.DEFAULT"/>

"android.intent.category.BROWSABLE"/>

"testjs"/>

 

在activity中可以取到通过浏览器传递的值

@Override

protected void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

 

if(Intent.ACTION_VIEW.equals(getIntent().getAction())){

Intentintent = getIntent();

Stringscheme = intent.getScheme();

Uriuri = intent.getData();

 

Log.e(tag,"scheme: "+scheme);

Log.e(tag,"path: "+uri.getPath());

Log.e(tag,"Host: "+uri.getHost());

Log.e(tag,"name: "+uri.getQueryParameter("name"));

Log.e(tag,"age: "+uri.getQueryParameter("age"));

}

 

}

原文地址:https://www.cnblogs.com/liuss2014/p/4900933.html