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"));

}

}

android/ios js 启动apk的更多相关文章

  1. React Native & Android & iOS & APK

    React Native & Android & iOS & APK https://play.google.com/apps/publish/signup/ $ 25 bui ...

  2. Android & iOS 启动画面工具

    感谢Aone!为我们开发了如此便捷的工具!! 以下为原文:  Android & iOS 启动画面工具 下载:OneSplash.启动画面工具.Aone.20190318.zip 说明:这一个 ...

  3. React++ node.js ++SQL Sever ++MySQL++ python ++ php ++ java ++ c++ c#++ java ++ android ++ ios ++Linux+

    "C语言在它诞生的那个年代,是非常不错的语言,可惜没有OOP.当项目臃肿到一定程度,人类就不可控了. 为了弥补这个缺陷,C++诞生了.而为了应对各种情况,C++设计的大而全,太多复杂的特性, ...

  4. android 通过命令行启动Apk

    几个启动指定程序activity的例子 Music 和 Video(音乐和视频)的启动方法为: # am start -n com.android.music/com.android.music.Mu ...

  5. 用HTML5/CSS3/JS开发Android/IOS应用框架大全

    现在人人都想成为安卓/IOS应用开发工程师.其实,安卓/IOS应用可以用很多种语言来实现.由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了.所以,今天大家将会 ...

  6. Android动态方式破解apk终极篇(加固apk破解方式)

    一.前言 今天总算迎来了破解系列的最后一篇文章了,之前的两篇文章分别为: 第一篇:如何使用Eclipse动态调试smali源码 第二篇:如何使用IDA动态调试SO文件 现在要说的就是最后一篇了,如何应 ...

  7. Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信

    紧接着<Tomcat单向Https验证搭建,亲自实现与主流浏览器.Android/iOS移动客户端安全通信>,此处演示下更安全的双向Https认证的通信机制,为了清晰明了,以下进行单独描述 ...

  8. Tomcat单向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端安全通信

    众所周知,iOS9已经开始在联网方面默认强制使用Https替换原来的Http请求了,虽然Http和Https各有各的优势,但是总得来说,到了现在这个安全的信息时代,开发者已经离不开Https了. 网上 ...

  9. Android IOS WebRTC 音视频开发总结(二三)-- hurtc使用说明

    本文主要介绍如何测试基于浏览器和手机的视频通话程序,转载请说明出处,文章来自博客园RTC.Blacker,更多详见www.blackerteam.com   很多人想测试浏览器(包括浏览器版本和桌面e ...

随机推荐

  1. ZipFile解压文件不改变压缩包内文件修改日期的方法

    本文参考http://stackoverflow.com/questions/9813243/extract-files-from-zip-file-and-retain-mod-date-pytho ...

  2. dma_ops

    kernel中的dma缓存区管理层操作统一实现在  struct dma_map_ops 中: dma缓存区分配函数的具体实现参考: http://www.aichengxu.com/view/599 ...

  3. SqlServer传输数据到ORACLE,SSIS

    一.配置32位ODBC 配置tnsname文件,增加ORACLE数据库 打开32位ODBC 二.创建一个PROJECT并配置数据源 1.创建一个project 三.数据传输SSIS,工作流 四.为DT ...

  4. Python os模块之文件操作

    基本概念:C:\\haoguo.txt 路径: C:\\ 文件名: haoguo 后缀名:.txt 1. 文件名与后缀分离 2. 路径与文件分离 3. 获取当前路径 4. 文件名与后缀合并 5. 路径 ...

  5. cookie小记

    清除cookie可用下面2种的方法.注意如果要清除的cookie的域是指定的,则这里也应该指定,否则无效                1:                Response.Cooki ...

  6. XtraReport 添加空行的办法,很详细

    这两天为了做报表,研究了一下XtraReport .为了添加空行,想了很多办法.其中如果有分组时,网上给出的办法就会失败.现将经验公布一下,希望各位都能少走弯路. 1.加入自定义函数CreateCel ...

  7. 4.代码同时托管到github和git.oschina.net

    我的开源项目托管在Github,同时在Git@OSC也有备份,有两个地方,是不是很麻烦呢?非也非也,下面介绍一下我是怎么做的. 1.先在Github新建一个项目,点击Github主页右上角的加号 -& ...

  8. nerual style 执行命令

    python neural_style.py --content ./examples/4-content.jpg --styles ./examples/4-faguo-style.jpg --ou ...

  9. 随部分div增高总的div也随着增高

    实现效果: 随着尺码框选项变多,高度也就增加,上边总体的大框高度也增加,简单的样式代码如下 代码: <div style=“height: auto; overflow: hidden;”> ...

  10. Module 'fileinfo' already loaded in Unknown on line 0

    出现的原因是:需要加载的扩展已经以而二进制文件的形式写入了php中,但是,在php.ini中却再一次动态加载 参考出处