Android 자체 앱을 브라우저를 통해 직접 여는 어시스턴트(거의 모든 브라우저, 앱 지원)

3235 단어
어떻게android에서 브라우저를 통해 링크를 클릭하여 apk를 열 수 있습니까?
이 기능을 실현하기 위해 나를 오랫동안 괴롭혔다.
인터넷 검색에서 많은 것들이 로 프로그램을 시작합니다
그리고 자체 앱으로 scheme를 등록하고 이런 링크를 클릭하면 앱을 시작할 수 있습니다.
이런 방법은 시스템 브라우저가 아닌 핵도 사용할 수 없다는 데 큰 문제가 있다.
제3자 브라우저를 호환시키려면 머리를 써야 한다.
마지막으로 인터넷에 접속하면 어떤 조수의 페이지는 각종 브라우저에 설치된 로컬 앱을 시작할 수 있다는 글을 볼 수 있다.
이 사고방식에 근거하여 한번 뒤척여 보니 확실히 OK되었다.
주의: 위챗과 자체 브라우저는 이미 127.0.0.1을 차단했기 때문에 만약 당신이 위챗에서 시험해 보고 싶다면, 면제합니다. 다른 브라우저는 기본적으로 모두 시험해 보았습니다.
원리: 스스로 HTTP 서버를 만들어서 127.0.0.1의 어떤 포트를 감청하고 웹 페이지는 링크 호출이나 Jquery 따위에 상관없이 당신을 따른다.
본 논문 필독: 안드로이드 버전 웹 서버 구현 (1) HTTP 프로토콜 요청 헤더 분석
원리를 수정하려면 다음과 같이 하십시오.
SessionThread의 run을 주로 수정합니다()
그리고 원래fetchContent 함수를 우리가 원하는 것으로 바꾸면 대체로 다음과 같다.
1. URL이 우리의 응용 프로그램인지 판단
2, 해석 URL, 매개 변수QueryString
3. 저희 APP 시작
오늘의 예로 여기fetchContent를 간단하게 썼는데 대체로
1. 링크에'luozhuang'이 있는지 판단하고 있으면 저희 앱을 시작합니다.
2. 원래 라인에 상하문 환경이 없기 때문에 여러분은 매개 변수로 WebServer 또는 상하문 환경을 갖춘 다른 물건을 전달해야 합니다.
이렇게 해야만 당신은 앱을 시작할 수 있습니다. 여기는 제가 웹서버에 직접 봉인했습니다. 어떻게 쓰는지 모두가 알고 있을 것입니다.
이 서버의 포트는Defaults를 수정할 수 있습니다.java에서, 예를 들어 20001, 그리고 우리의 링크는 애플리케이션 시작
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());
		}
	}

}

좋은 웹페이지 즐겨찾기