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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 从ResNet101到ResNet50

    从ResNet101到ResNet50一直用VGG训练,几天前想看下ResNet的效果如何,因为SSD源码中有python实现的ResNet网络结构实现代码,包含ResNet101和ResNet152,直接拿ResNet101来训练,GTX1060配置,batchsize竟然只降到2才跑的起来,果然一直收敛不了。看了下model_libs.py里面的实现代码:defResNet101Body(net,from_layer,u

    2022年10月7日
    0
  • python zipfile_Python zipfile

    python zipfile_Python zipfile从简单的角度来看的话,zip格式会是个不错的选择,而且python对zip格式的支持够简单,够好用。1)简单应用如果你仅仅是希望用python来做压缩和解压缩,那么就不用去翻文档了,这里提供一个简单的用法,让你一看就能明白。importzipfilef=zipfile.ZipFile(‘filename.zip’,’w’,zipfile.ZIP_DEFLATED)f.write(‘fil…

    2022年9月17日
    0
  • ping 与 traceroute 的工作原理分析

    ping 与 traceroute 的工作原理分析一、ping    ping程序的主要目的是测试主机是否可达,它发送 ICMP回显请求报文给目的主机,并等待返回ICMP回显应答    ping程序一般会周期性持续地发送ICMP请求报文,除非用户手动终止,或指定了发送报文个数    回显请求和回显应答通过序列号(icmp_seq)进行匹配,下图中序列号依次为1、2、3、4…    pi…

    2022年7月21日
    20
  • R语言入门mac——RStudio安装➕R包安装【附安装链接】[通俗易懂]

    R语言入门mac——RStudio安装➕R包安装【附安装链接】[通俗易懂]R语言入门mac——安装【附安装链接】这里写目录标题R语言入门mac——安装【附安装链接】一、总体安装步骤1安装R2下载RStudio二、R包安装一、总体安装步骤1安装RRStudio需要R3.0.1+下载链接:https://cran.rstudio.com/2下载RStudio下载链接:https://rstudio.com/products/rstudio/download/二、R包安装下面展示r包安装代码rm(list=ls())options()$repos

    2022年6月27日
    163
  • php批量修改怎么实现,PinPHP购物分享系统2.2后台批量采集修改实现方法

    php批量修改怎么实现,PinPHP购物分享系统2.2后台批量采集修改实现方法因前段时间较忙,所以一直将这开发搁置了。今天看了一下新版的PinPHP,又心血来潮于是写了一下这个批量采集的实现,没想到写了差不多一两小时就实现了,虽然写得比较简单,也算是可以帮助一键采集一个分类。同时非常感谢PinPHP团队开发出如此好使的开源程序,哈,闲话先不多说,上代码。附源文件:下载源代码请猛击这里>>主要是对一个模板文件作了修改。/PinPHP_V2.21/admin/Tpl…

    2022年6月6日
    21
  • 【目录】【中文】【deplearning.ai】【吴恩达课后作业目录】「建议收藏」

    【目录】【中文】【deplearning.ai】【吴恩达课后作业目录】「建议收藏」一份中文版的目录,请查收~

    2022年7月18日
    31

发表回复

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

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