仿某助手,通过浏览器直接打开Android 自己的App 应用程序(支持几乎所有浏览器、app)

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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值