换个角度看问题
换个角度看问题,可以节省你大量时间,提高你的效率。
背景
公司开发的一个 app,有用户反馈在打开网页点击上传图片按钮时,点击拍照不能唤起系统相机。还说在 Android 6.0 以上手机可以,以下不行。
听到这里,我大概知道应该是权限问题了。
更多关于权限的可以看下我这篇文章 android开发之调皮的权限。
解决之路
既然知道是权限问题,那么问题就简单了,在选择系统相机的时候申请权限就可以了。
然而事实是:
在说明踩坑之路之前我们先说下储备知识。
储备知识
- 需要一个页面。
代码如下,可以直接保存到记事本,然后修改文件名即可。
<html> <body> <input type = "file" accept="image/jpg, image/png, image/jpeg" id="myFile" /> </body> </html>
页面内容很简单,就是一个文件上传按钮,支持图片文件上传。
- 需要一个 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 浏览器在权限拒绝之后忘记做清理工作了。
通过参考其他浏览器的实现,相信对你来说解决这个问题是没太多难度的。
从这个事件,我们可以发现,我们很多时候不需要做第一个吃螃蟹的人。
可以换个角度看问题,不要钻牛角尖。
毕竟公司分配给你任务,是有一个时间的。
不是让你去做研究的。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android多线程之AsyncTask源码解析
AsyncTask 是一个较为轻量级的异步任务类,在底层通过封装 ThreadPool 和 Handler ,实现了线程的复用,后台任务执行顺序的控制、子线程和 UI 线程的切换,使得开发者可以以简单的方法来执行一些耗时任务 此篇文章就基于 Android API 27 版本的源码来对 AsyncTask 进行一次整体分析,以便对其底层工作流程有所了解 一般,AsyncTask 是以类似于以下的方式来调用的 new AsyncTask<String, Integer, String>() { @Override protected String doInBackground(String... strings) { return null; } }.execute("leavesC"); 所以这里就从 execute() 方法入手 //以默认的串行任务执行器 sDefaultExecutor 来执行后台任务 @MainThread public final AsyncTask<Params, Progress, Result> execute(Params......
- 下一篇
魔法秀,让你的 H5 页面秒变 Hybrid APP(混合应用)
原文地址:https://wangfanggang.com/Mobile/native-apex/ 引言 很多时候我们也想要有自己的移动端APP,怎奈还要兼容 iOS、Android 不同平台,开发成本太高。昨天刷 twitter,无意中发现一个好玩的网站 https://gonative.io/,输入任意网址,就可以快速帮你创建好可以部署在 iOS 和 Android 平台上的代码(当然不是免费的,价目表在这里),用来测试移动端效果还不错,有类似需求的同学可以关注一下。 配置步骤 整个配置过程非常简单,只需要填你要生成的网址和你的邮箱,点击生成按钮,稍等几分钟,你的邮箱会收到一封邮件,打开里面的地址,就可以在线体验了。 演示效果 我用 apex.oracle.com 上自带的 demo 应用简单尝试了一下,效果很好,感兴趣的小伙伴也可以直接打开这个网址来体验:https://gonative.io/share/jezbmd username:demopassword:demo 以下是一些截图: iOS 平台 Android 平台 结尾 原理虽然跟微信小程序 WebView 内嵌 H5...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS关闭SELinux安全模块
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度