仿某助手,通過瀏覽器直接打開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());
		}
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章