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