zoukankan      html  css  js  c++  java
  • 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"));

    }

     

    }

  • 相关阅读:
    mysql用 法like concat()
    redis系列之数据库与缓存数据一致性解决方案
    day33:进程锁&事件&进程队列&进程间共享数据
    day32:进程&进程join&守护进程deamon
    day31:socketserver&hashlib&hmac&TCP登录
    day30:TCP&UDP:socket
    day29:计算机网络概念
    小程序3:ATM小程序
    hdu 6867 Tree 2020 Multi-University Training Contest 9 dfs+思维
    Codeforces Round #660 (Div. 2) Captain Flint and Treasure 拓扑排序(按照出度、入读两边拓扑排序)
  • 原文地址:https://www.cnblogs.com/liuss2014/p/4900933.html
Copyright © 2011-2022 走看看