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两种方式结合起来是最完美的方式,这样第一种方式不通自动切到第二种方式,可以实现大多数浏览器的兼容

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 警告:为了安全请不要随意将ASP.Net的validateRequest=”false” .

    警告:为了安全请不要随意将ASP.Net的validateRequest=”false” .ASP.Net1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力。当用户试图用之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpRequestValidationExceptioin。默认情况下会返回如下文字的页面:ServerErrorin’/YourApplicationPath’ApplicationApot

  • full connection layer(inconnected)

    我的机器学习教程「美团」算法工程师带你入门机器学习已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~定义…

  • USB计算机连接只能充电,手机连接不上电脑只显示充电怎么办[通俗易懂]

    USB计算机连接只能充电,手机连接不上电脑只显示充电怎么办[通俗易懂]有的时候,需要把电脑上的资料传到手机上或者把手机上的一些照片传到电脑上面,但是有时候想要传照片的时候会发现手机与电脑连接在一起的时候只显示出在充电,但是与电脑没有连接在一起,相信很多朋友们都会遇到这样的问题,首先要排除的是手机的数据线没有任何的问题,如果说手机的数据线没有问题的的话那就一定是驱动的问题而引发的,那么今天小编就教大家如果手机为什么连接不上电脑应该怎么办。第一步:如果已经确定了不是数据…

  • python控制灯_树莓派python编程 做一个LED呼吸灯「建议收藏」

    呼吸灯概述上一篇我们通过控制GPIO口输出高低电平来控制一只LED的亮灭。这次我们来控制LED的亮度,灯由暗渐渐变亮,再由亮渐渐边暗,反复循环,也就是呼吸灯的效果。按Ctrl+C结束程序。通过本节课,你能学习到:脉冲宽度调制技术所需硬件树莓派x1面包板x1杜邦线x2LED灯x1名称解释我们知道,通过LED的电流越大,LED越亮,电流越小,LED越暗。如果可以控制输出电流大小就可…

  • 风控模型基本概念和方法

    风控模型基本概念和方法每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~———————————————————————————本笔记源于CDA-DSC课程,由常国珍老师主讲。该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营———————…

  • Android 标签控件

    Android 标签控件

发表回复

您的电子邮箱地址不会被公开。

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