您的位置:首页 > 移动开发

仿某助手,通过浏览器直接打开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,然后服务器有个返回值就更好了,大家自己完善吧。

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());
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: