大家好,又见面了,我是你们的朋友全栈君。
有时我们想通过点击浏览器中某些广告链接来启动或下载APP,以启动APP来说,我们知道APP可以定义一个scheme,如果我们在浏览器中定义一个URL,这个URL使用定义的scheme,这样点击后我们就可以打开我们的客户端了,但目前市面上有些浏览器支持性不好,或者直接就不支持,认为这个打开是一个有害的链,那么我们还有没有其它的办法来结合,下面我们以web服务做为功能基础来实现
我们知道如果在地址栏中输入http://127.0.0.1:port 实际上是访问本地的一个端口号,http底层实现又是基于socket来实现,那么我们可以在我们客户端中建立一个socket服务监听某个端口,然后在手机的浏览器中进行127的访问必定会收到数据,根据地址中参数来决定逻辑,我们看来实例:
public void run() {
Socket socket = null;
ServerSocket ss = new ServerSocket(8181, 5, InetAddress.getByName("127.0.0.1"));
if (ss == null) {
return;
}
while (true) {
try {
socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null;
String getStr = null;
boolean valid = false;
int code = 0;
while (!TextUtils.isEmpty((line = br.readLine()))) {
Log.e("SOCKET", "Get header : " + line);
if (line.startsWith("GET")) {
getStr = line;
}
}
boolean runState = false;
String callback = null;
if (!TextUtils.isEmpty(getStr)) {
String[] req = getStr.split(" ");
Uri uri = Uri.parse(req[1]);
Log.e("SOCKET", "url " + uri);
final String id = uri.getQueryParameter("id");
callback = uri.getQueryParameter("callback");
//根据传入进来的id进行不同逻辑
}
//无论什么条件,都必须执行writeResponse,给请求者一个Response回应
writeResponse(socket, callback, runState, code);
br.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void writeResponse(Socket socket, String callback, boolean runState, int errorCode) {
try {
OutputStream os = socket.getOutputStream();
StringBuilder builder = new StringBuilder();
builder.append("HTTP/1.1 200 OK\r\n");
builder.append("Connection: close\r\n\r\n");
os.write(builder.toString().getBytes());
if (!TextUtils.isEmpty(callback)) { // 是否有回调函数
callback += "(" + android.os.Build.VERSION.SDK_INT + "," + (runState ? 1 : 0) + "," + errorCode + ");";
os.write(callback.getBytes());
}
os.flush();
os.close();
Log.d("SOCKET", "invoke js callback: " + callback + ", runState: " + runState + ", errorCode: " + errorCode);
} catch (Exception e) {
e.printStackTrace();
}
}
这里可以把客户端当作了一个web服务器,所有的浏览器以127形式请求都到了客户端,一个完整的请求是必须有response的,所以在你接收到任何请求后都要给请求者一个回应,不然请求者会当作请求超时处理,代码不多,主要是把客户端当成了服务器,其实把scheme和127.0.0.1两种方式结合起来是最完美的方式,这样第一种方式不通自动切到第二种方式,可以实现大多数浏览器的兼容
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/146397.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...