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


相关推荐

  • java实现发送手机验证码功能

    java实现发送手机验证码功能1.进入秒嘀科技(http://www.miaodiyun.com/),注册一个账号2.注册好之后,点击用户中心->账户管理,就会进入如下界面(顺便提一下,新注册的用户,平台会免费赠送你10元,足够大家学习和使用了,所以不用担心需要充钱)你需要做的就是获取你自己的ACCOUNTSID和AUTHTOKEN3.点击用户中心->认证,进行企…

    2022年7月21日
    19
  • idea 2021.3.4激活码(JetBrains全家桶)[通俗易懂]

    (idea 2021.3.4激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    424
  • web基础知识_Web开发基础

    web基础知识_Web开发基础传统身份验证的方法:HTTP是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的ID号发送给客户端,客户端收到以后把这个ID号存储在C…

    2022年9月13日
    5
  • springboot线程池的使用和扩展

    springboot线程池的使用和扩展我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务;本文地址:http://blog.csdn.net/boling_cavalry/article/details/79120268实战环境windowns10;jdk1.8;spring

    2022年6月30日
    21
  • Hibernate Criterion

    Hibernate Criterion

    2021年12月7日
    45
  • lcd1602使用手册_lcd1602的rs,rw和e三个引脚的功能

    lcd1602使用手册_lcd1602的rs,rw和e三个引脚的功能1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。lcd1602引脚状态字的说明:RAM映射地址:控制接口的时序:1.读的时序2.写的时序3.时序的相关参数读状态:RS=L,R/W=H,EN=H读数据:RS=H,…

    2022年4月19日
    3.1K

发表回复

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

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