仿某助手,通过浏览器直接打开Android 自己的App 应用程序(支持几乎所有浏览器、app)
2016-05-26 16:11
666 查看
怎么在android实现通过浏览器点击链接打开apk?
为了实现这个功能可折腾了我好久。
上网搜搜,很多都是说用<a href="[scheme]://[host]/[path]?[query]">启动应用程序</a>
然后自己app注册一个scheme,然后可以点击这种链接就可以启动APP
这种做法有个很大问题,就是非系统浏览器的内核都无法使用。
想让第三方浏览器兼容,就得动动脑筋了。
最后上网看到某篇文章说,某助手的页面,是可以实现在各种浏览器启动已经安装好的本地app的。
根据这个思路,捣腾了一下确实OK了。
注意:微信以及自带浏览器已经屏蔽127.0.0.1,所以如果你想在微信上试试,就免了,其他浏览器我基本都试过。
原理:自己做个HTTP服务器监听127.0.0.1的某个端口,然后网页不管链接调用或者Jquery之类,都随你了。
本文必读:
Android版Web服务器实现(一)HTTP协议请求头解析
修改原理:
主要修改SessionThread的run()
然后将原来的fetchContent 函数改为我们想要的,大体就是:
1、判断URL 是否是我们的应用
2、解析URL,参数QueryString
3、启动我们的APP
作为我们今天的例子,这里fetchContent 我写的很简单,大体就是
1、判断链接是否有“luozhuang”,有的话就启动我们的app
2、由于原线程没有上下文环境,大家需要用参数把WebServer 或者其他具备上下文环境的东西传过来,
这样你才可以启动APP,这里我直接封进WebServer里面了,怎么写,大家应该都知道。
至于这个服务器的端口,可以修改Defaults.java里面,比如20001,然后我们的链接只要<a href="http://127.0.0.1:20001/luozhuang/index.html">启动应用程序</a>
就OK了,当然如果能用Jquery,然后服务器有个返回值就更好了,大家自己完善吧。
为了实现这个功能可折腾了我好久。
上网搜搜,很多都是说用<a href="[scheme]://[host]/[path]?[query]">启动应用程序</a>
然后自己app注册一个scheme,然后可以点击这种链接就可以启动APP
这种做法有个很大问题,就是非系统浏览器的内核都无法使用。
想让第三方浏览器兼容,就得动动脑筋了。
最后上网看到某篇文章说,某助手的页面,是可以实现在各种浏览器启动已经安装好的本地app的。
根据这个思路,捣腾了一下确实OK了。
注意:微信以及自带浏览器已经屏蔽127.0.0.1,所以如果你想在微信上试试,就免了,其他浏览器我基本都试过。
原理:自己做个HTTP服务器监听127.0.0.1的某个端口,然后网页不管链接调用或者Jquery之类,都随你了。
本文必读:
Android版Web服务器实现(一)HTTP协议请求头解析
修改原理:
主要修改SessionThread的run()
然后将原来的fetchContent 函数改为我们想要的,大体就是:
1、判断URL 是否是我们的应用
2、解析URL,参数QueryString
3、启动我们的APP
作为我们今天的例子,这里fetchContent 我写的很简单,大体就是
1、判断链接是否有“luozhuang”,有的话就启动我们的app
2、由于原线程没有上下文环境,大家需要用参数把WebServer 或者其他具备上下文环境的东西传过来,
这样你才可以启动APP,这里我直接封进WebServer里面了,怎么写,大家应该都知道。
至于这个服务器的端口,可以修改Defaults.java里面,比如20001,然后我们的链接只要<a href="http://127.0.0.1:20001/luozhuang/index.html">启动应用程序</a>
就OK了,当然如果能用Jquery,然后服务器有个返回值就更好了,大家自己完善吧。
package com.sparkle.webservice; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import android.util.Log; //luozhuang server public class SessionThread extends Thread { private Socket _clientSocket = null; private final int BUFFER_MAX = 8192; private DataHandle _dataHandle = null; private MyLog _myLog = new MyLog(getClass().getName()); WebServer webServer; public SessionThread(Socket clientSocket, WebServer webServer) { this._clientSocket = clientSocket; this.webServer=webServer; } public void closeSocket() { if (_clientSocket == null) { return; } try { _clientSocket.close(); } catch (IOException e) { _myLog.e(e.getMessage()); } } public void run() { try { InputStream socketInput = _clientSocket.getInputStream(); byte[] buffer = new byte[BUFFER_MAX]; socketInput.read(buffer); byte[] content = fetchContent(buffer); sendResponse(_clientSocket, content); } catch (Exception e) { _myLog.l(Log.DEBUG, "Exception in TcpListener"+e.getMessage()); } } public byte[] fetchContent(byte[] buffer) { _dataHandle = new DataHandle(buffer); byte[] backData = null; if (!_dataHandle.isSupportMethod()) { backData = _dataHandle.fetchNotSupportMethodBack(); return backData; } HttpHeader httpHeader= _dataHandle.get_httpHeader(); if(httpHeader.getUrl().indexOf("luozhuang")>-1) { webServer.startactivity(); } backData =new byte[0]; return backData; } private void sendResponse(Socket clientSocket, byte[] content) { try { OutputStream socketOut = clientSocket.getOutputStream(); byte[] header = _dataHandle.fetchHeader(content.length); socketOut.write(header); socketOut.write(content); socketOut.close(); clientSocket.close(); } catch (Exception e) { _myLog.e( e.getMessage()); } } }
相关文章推荐
- RxJava操作符学习APP
- ViewPager切换过来后,组件没有重新加载
- Objective-C-UI控件学习之UIView中坐标转换的方法
- 【swift学习笔记】二.页面转跳数据回传
- OC(Objective-C)学习笔记(一)--import的作用
- jersey 示例获取List<Object>(二)
- 【swift学习笔记】二.页面转跳数据回传
- iOS 支持 IPv6
- Android studio中关于如何签名apk和查询项目的SHA1
- 解决android: SQLiteDatabaseLockedException: database is locked
- 《Android 之美 从0到1 -- 高手之路》
- 不使用广告而采集IDFA的app上架
- Android MVP
- Android应用自动更新、下载、安装
- android自定义view之卡片式轮播图
- cocos 2.2.3 和 cocos 2.2.6下载地址
- 微信支付接口之心酸
- Swift资源包----Swift语言的特点
- Android布局文件的一些属性值
- Fragment学习记录一 静态创建fragment