zoukankan      html  css  js  c++  java
  • 换个角度看问题

    换个角度看问题,可以节省你大量时间,提高你的效率。

    背景

    公司开发的一个 app,有用户反馈在打开网页点击上传图片按钮时,点击拍照不能唤起系统相机。还说在 Android 6.0 以上手机可以,以下不行。

    听到这里,我大概知道应该是权限问题了。

    更多关于权限的可以看下我这篇文章 android开发之调皮的权限

    解决之路

    既然知道是权限问题,那么问题就简单了,在选择系统相机的时候申请权限就可以了。

    然而事实是:

    在说明踩坑之路之前我们先说下储备知识。

    储备知识

    1.需要一个页面。
    代码如下,可以直接保存到记事本,然后修改文件名即可。

    <html>
        <body>
            <input type = "file" accept="image/jpg, image/png, image/jpeg" id="myFile" />
        </body>
    </html>
    

    页面内容很简单,就是一个文件上传按钮,支持图片文件上传。

    2.需要一个 Android Demo。
    这个 Demo 有一个页面,页面里面就有一个 WebView。
    开发过 Android WebView 的都知道,Android 上传文件对于不同的系统做法不一样。
    我们这里以 Android 5.0 的文件上传为例。

    webview.setWebChromeClient(new WebChromeClient() {
            // For Android >= 5.0
            @Override
            public boolean onShowFileChooser(WebView webView, 
                    ValueCallback<Uri[]> filePathCallback, 
                    WebChromeClient.FileChooserParams fileChooserParams) {
                //TODO call system intent
                return true;
            }
        });
    

    相信大家对于上面代码并不陌生。
    我们就是需要在 TODO 里面调用系统相机和系统相册等 Intent。
    调用后大概效果如下:

    好了,到了这里就可以开始说下踩坑之路了。

    踩坑之路

    希望知道上面点击的是相机还是文档。
    为什么需要知道这个呢?
    因为一般 App 启动的时候默认会申请存储权限。
    所以假设用户点击文档,那么是不需要申请相机权限的。
    因此我们需要做到当用户点击相机的时候才去申请权限。

    所以基于这一点,开始网络查找资料,陷入坑中。
    比如:
    Intent.ACTION_CHOOSER 与 Intent.ACTION_PICK_ACTIVITY。
    当然关于 Intent.ACTION_PICK_ACTIVITY 的例子很少,最后这边弃用了。
    再比如:
    通过 createChooser(Intent target, CharSequence title, IntentSender sender) 的第三个参数 IntentSender 来判断。
    这个也是觉得很复杂,成本较高,不太合适。

    那到底应该怎么处理呢?
    这个时候就不要死磕这一点了,而是要站在巨人的肩膀上
    WebView 说到底也可以看成是一个精简版的浏览器,因此我们完全可以参考下浏览器的做法。

    这边使用的手机为三星 S7,以这个手机为例。

    在系统三星浏览器上点击,马上弹出权限申请

    因此解决方法之一是点击就申请权限。

    在 UC 浏览器上点击,弹出如下框( PS:可能一打开文件进入会提示出错,再打开即可):

    只有在点击相机拍照才会去申请权限,是不是更好,权限申请更严格。
    不过实际测试发现了一个 BUG。
    就是权限申请如果拒绝,再次点击页面无响应。
    估计 UC 浏览器在权限拒绝之后忘记做清理工作了。

    通过参考其他浏览器的实现,相信对你来说解决这个问题是没太多难度的。

    从这个事件,我们可以发现,我们很多时候不需要做第一个吃螃蟹的人。
    可以换个角度看问题,不要钻牛角尖。
    毕竟公司分配给你任务,是有一个时间的。
    不是让你去做研究的。

  • 相关阅读:
    数组有没有length()这个方法? String有没有length()这个方法?
    序列化接口的id有什么用?
    如何进行Hibernate的性能优化?
    构造器Constructor是否可被override?
    Collection框架中实现比较要实现什么接口?
    ArrayList如何实现插入的数据按自定义的方式有序存放?
    Java中会存在内存泄漏吗,请简单描述?
    List 和 Map 区别?
    面向对象的特征有哪些?
    垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
  • 原文地址:https://www.cnblogs.com/nesger/p/9224206.html
Copyright © 2011-2022 走看看