换个角度看问题

简介: 换个角度看问题,可以节省你大量时间,提高你的效率。背景公司开发的一个 app,有用户反馈在打开网页点击上传图片按钮时,点击拍照不能唤起系统相机。

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

背景

公司开发的一个 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 浏览器在权限拒绝之后忘记做清理工作了。

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

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

相关文章
|
测试技术
解决Bug应有的心态和解决方法的一些思路、方法和心得
永远要相信程序是不会骗你的,是自己在处理理逻辑中出问题,而在特定的环境中才会出现或者是自己压根就想不到情况下出现。 前几天在处理一个接口任务时,在测试环境跑是一点都没有,但在正式环境却没有将数据拉下来。没有报任何错误,一度怀疑、抱怨! 还好最后找到问题解决了!
99 0
|
运维 算法 前端开发
评委角度看晋升,建议做好这几件事
作者总结了今年作为评委参加的很多晋升场子,其中以前端和客户端技术栈为主,总结了一些收获分享出来。
|
Java 程序员
IT学不好没什么,大不了躺平
IT学不好没什么,大不了躺平
|
数据采集 Web App开发 程序员
成长的路上,谁不曾反复自我怀疑
大多数人在入门之后,都会遇到一个比较大的“瓶颈期”:这个阶段,你已经了解了编程语言的基本语法,可以看懂入门书上的所有例子,但是合上教程却又无法写出一个完整的代码,对于接下来的学习又缺少方向。以至于对编程这件事情感到迷茫,甚至自我怀疑。
|
SQL
工作中的成长是从摆脱低水平勤奋开始的吗?
成长的本质是自我革新,成长就是在不断变化中的积极面。深度思考、目标设定、自律实践、持续学习、总结反思等步骤可以帮助我们成长,同时也需要避免陷入低水平勤奋的陷阱,不要忙于行动而忽视了反思和学习。
160 1
|
存储 关系型数据库 MySQL
换一个角度看 B+ 树
从数据页的角度看 B+ 树,看看每个节点长啥样。
换一个角度看 B+ 树
|
存储 程序员 C++
如果当初学习编程时能有人给我这些忠告该多好
Cecily Carver 是多伦多的一位程序媛,和 Jennie Faber 一起创办了一个游戏制作工作室。她喜欢歌剧、舞蹈和弹钢琴。Cecily 在这篇文章分享她在编程道路上的所感所想,给出很多值得思考的编程箴言以及一些思想误区,比如在你学习编程之前思考一下你的目标、编程不是什么神秘的东西、坚持比方法更重要等,可以让我们在编程路上少走一些弯路,从而有更多的时间学习技术让自己变的越来越强大。
233 0
|
运维 Kubernetes 前端开发
换个角度入门 K8s
本文通过一个业务发展的故事,分享 K8s 出现的原因以及它的运作方式。适合所有技术开发人员,尤其是前端开发者。
1746 0
换个角度入门 K8s