Android浏览器调用APP「建议收藏」

Android浏览器调用APP「建议收藏」有时我们想通过点击浏览器中某些广告链接来启动或下载APP,以启动APP来说,我们知道APP可以定义一个scheme,如果我们在浏览器中定义一个URL,这个URL使用定义的scheme,这样点击后我们就可以打开我们的客户端了,但目前市面上有些浏览器支持性不好,或者直接就不支持,认为这个打开是一个有害的链,那么我们还有没有其它的办法来结合,下面我们以web服务做为功能基础来实现我们知道如果在地址栏

大家好,又见面了,我是你们的朋友全栈君。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146397.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • deepfacelab最新版使用教程(deepfacelab训练技巧)

    欢迎进入本教程,本教程不定期更新本文教程内容更新时间为:2019/2,本文最后更新时间为:2019/3/8欢迎进群讨论,我不是群主,群主的各QQ群号码请看:https://deepfakes.com.cn/index.php/资助升级群这几天朱茵换脸杨幂的事件上了热门,我们群不存在该违法问题。然而因为网上的这个事件,2群排队已经可以说排到了明年。群主表示等风波结束了再考虑新群,毕竟群主不想…

    2022年4月17日
    517
  • shell 格式化json(python json.loads)

    LINUXSHELL解析JSON格式1.使用工具jqhttps://stedolan.github.io/jq/下载版本linux版本jq-linux64Ubuntu直接sudoapt-getinstalljq即可。2.解析json[root@casscript]#cattest.json{“tasks”:[{“id”:”simpletour-wechat.a17506e7

    2022年4月17日
    71
  • Java 数组转list_java定义list数组

    Java 数组转list_java定义list数组方式一String[]array={“111″,”222″,”333”};Listlist=Arrays.asList(array);//list.add(“444”);list.remove(0);如上图所示,不可进行新增或删除元素的操作。Arrays.asList(array),返回的List是具有固定长度的私有静态内部类java.util.Arrays.ArrayList,所以…

    2022年8月23日
    6
  • docker容器端口冲突_docker web管理工具

    docker容器端口冲突_docker web管理工具COMMAND_FAILED:’/sbin/iptables-tnat-A Docker -ptcp-d0/0–dport8111-jDNAT–to-destination172.17.0.6:8111!-idocker0’failed:iptables:Nochain/target/matchbythatname.pk

    2022年8月31日
    7
  • 多线程模型下的无锁编程「建议收藏」

    多线程模型下的无锁编程「建议收藏」多线程模式是比较流行的一种并发编程模型,多线程编程的一个特点就是线程间共享内存空间;这可以降低线程间通信的开销,但却引来了另外的一个难缠的问题:竟态条件!,因此,甚至有人对多线程模型提出了质疑,看这里。在多线程编程模型下,解决竟态条件的传统方法就是加锁保护临界区,但这存在影响系统性能、优先级反转等问题.因此又有人提出了,多线程模型下无锁编程的一些方式:1.线程内通信框架:Di

    2022年5月9日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号