您现在的位置是:网站首页> 内容页

换个角度看问题

  • 拉斯维加斯3499.com
  • 2019-10-10
  • 5人已阅读
简介换个角度看问题,可以节省你大量时间,提高你的效率。背景公司开发的一个app,有用户反馈在打开网页点击上传图片按钮时,点击拍照不能唤起系统相机。还说在Android6.0以上手机

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

背景

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

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

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

文章评论

Top