Android浏览器调用APP

有时我们想通过点击浏览器中某些广告链接来启动或下载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两种方式结合起来是最完美的方式,这样第一种方式不通自动切到第二种方式,可以实现大多数浏览器的兼容

没有更多推荐了,返回首页