当前位置: 首页 > news >正文

换个角度看问题

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

背景

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

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

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

解决之路

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

然而事实是:


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

储备知识

  1. 需要一个页面。
    代码如下,可以直接保存到记事本,然后修改文件名即可。
<html>
    <body>
        <input type = "file" accept="image/jpg, image/png, image/jpeg" id="myFile" />
    </body>
</html>

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

  1. 需要一个 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 浏览器在权限拒绝之后忘记做清理工作了。

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

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

相关文章:

  • Lr(3)-脚本调试之“参数化、检查点”
  • 添加删除mysql用户
  • dp学习笔记1
  • AT&T以11亿美元的价格将数据中心出售给Brookfield
  • mysql开启常规日志
  • js里的数据转换
  • sql删除重复数据只保留一条
  • 构建可观测的分布式系统
  • centos 普通用户获得sudo超级权限
  • 比特币独角兽圈在5月份新机构客户中录得30%的
  • sql server数据库导入导出bcp方法
  • 弱监督学习下的商品识别:CVPR 2018细粒度识别挑战赛获胜方案简介
  • Linux系统中通过mdadm程序实现软件RAID功能
  • 在weex里面使用chart图表
  • android数据库知识
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Docker 笔记(2):Dockerfile
  • javascript 总结(常用工具类的封装)
  • JS 面试题总结
  • mockjs让前端开发独立于后端
  • orm2 中文文档 3.1 模型属性
  • python_bomb----数据类型总结
  • springMvc学习笔记(2)
  • SQLServer插入数据
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 半理解系列--Promise的进化史
  • 对JS继承的一点思考
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 老板让我十分钟上手nx-admin
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 微信小程序设置上一页数据
  • 我与Jetbrains的这些年
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 项目管理碎碎念系列之一:干系人管理
  • 小程序 setData 学问多
  • 移动端解决方案学习记录
  • 最简单的无缝轮播
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​插件化DPI在商用WIFI中的价值
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET Core中的去虚
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET命名规范和开发约定
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc