Android7.0及以上打开相机闪退,startActivityForResult报错解决
这个问题出现的原因主要是由于在Android 7.0以后,用了Content Uri 替换了原本的File Uri,故在targetSdkVersion=24的时候,部分 “`Uri.fromFile()“` 方法就不适用了。 **File Uri 与 Content Uri 的区别** - File Uri 对应的是文件本身的存储路径 - Content Uri 对应的是文件在Content Provider的路径 所以在android 7.0 以上,我们就需要将File Uri转换为 Content Uri。具体转换方法如下:(需要使用的时候直接复制粘贴即可)
/*** 转换 content:// uri** @param imageFile* @return*/public Uri getImageContentUri(File imageFile) {String filePath = imageFile.getAbsolutePath();Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new String[] { MediaStore.Images.Media._ID },MediaStore.Images.Media.DATA + "=? ",new String[] { filePath }, null);if (cursor != null && cursor.moveToFirst()) {int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));Uri baseUri = Uri.parse("content://media/external/images/media");return Uri.withAppendedPath(baseUri, "" + id);} else {if (imageFile.exists()) {ContentValues values = new ContentValues();values.put(MediaStore.Images.Media.DATA, filePath);return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);} else {return null;}}}
主要代码就是这样,下面写一个完整的调取系统相机的代码:
File outputImage = new File(ct.getSDPath() + "/bhne/export/" + projectpath + "/", java.util.UUID.randomUUID().toString() + ".jpg");pathImage = outputImage.toString();try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (Exception e) {e.printStackTrace();}Intent intentPhoto = new Intent("android.media.action.IMAGE_CAPTURE"); //拍照//Uri imageUri = Uri.fromFile(outputImage);//7.0之前的写法Uri imageUri = getImageContentUri(outputImage);//直接调用咱们上面写好的方法if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){intentPhoto.putExtra(MediaStore.EXTRA_OUTPUT,FileProvider.getUriForFile(PictureActivity.this,"bhne.com.wlprojectapplication.fileprovider", outputImage));}else {intentPhoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outputImage));}intentPhoto.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intentPhoto, 3);
Uri imageUri = getImageContentUri(outputImage);//直接调用咱们上面写好的方法
主要就是这一行代码,调用了上面所写的代码,还需注意的是需要在权限中声明一下:
<application...><providerandroid:name="android.support.v4.content.FileProvider"android:authorities="bhne.com.wlprojectapplication.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"></meta-data></provider>
然后在res文件下创建一个xml文件夹,在文件夹下创建新的xml文件,名字为file_paths:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-path name="external_files" path="."/>
</paths>
基本上就是这样,以后希望长点记性。
Android7.0及以上打开相机闪退,startActivityForResult报错解决相关推荐
- idea2019打卡没多久就闪退_IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)...
推荐阅读: 支持Java 14!Java开发工具IntelliJ IDEA 2020.1稳定版发布 https://www.jb51.net/softjc/720187.html IntelliJ I ...
- 电脑用计算机软件一直闪退,电脑软件打开后闪退或崩溃的解决办法
原标题:电脑软件打开后闪退或崩溃的解决办法 电脑闪退的因素很多,除了跟用户自身操作失误有关外,也和电脑软硬件有很大关系,例如病毒.木马程序的破坏,使用了测试版和盗版软件,软件本身存在bug,软件和系统 ...
- intellij idea打开就闪退或关闭详细解决办法
intellij idea打开就闪退或关闭详细解决办法 intellij idea打开就闪退或关闭详细解决办法 1.以管理员身份运行 2.如果是内存问题 3.其他 intellij idea打开就闪退 ...
- 在AVD上运行程序时,程序闪退并报错unfortunately,xx has stopped
在AVD上运行程序时,程序闪退并报错unfortunately,xx has stopped 事实上,这个错误是事出有因的,而非AVD或者AS有问题. 由于刚开始学习安卓,所以还没有习惯如何对安卓程序 ...
- 【已解决】labelme编辑label时,闪退;报错“IndexError: list index out of range”
当前虚拟环境: python 3.6.13 labelme 5.0.1 pip 21.3.1 1.IndexError: list index out of range ...
- kettle闪退问报错无法打开图形界面ETI安装问题
1.安装JDK(版本1.6版本以上) 2.JDK环境变量配置如图(后面的值都是自己的安装目录): 3.第一种错误直接闪退找到data-integration目录下的Spoon.bat 右键记事本编辑, ...
- IDEA 2020.1打开时闪退的问题及解决方法
之前使用idea旗舰版都是用po jie的版本,经常重启电脑就失效了,今天重启了电脑,idea旗舰版竟然点不开了,一点开,有个进度条走到一半,就闪退了,一脸懵逼!!! 在网上看了好多说修改idea的启 ...
- 电脑打开计算机的管理闪退怎么办,电脑软件打开后闪退或崩溃的解决办法
电脑闪退的因素很多,除了跟用户自身操作失误有关外,也和电脑软硬件有很大关系,例如病毒.木马程序的破坏,使用了测试版和盗版软件,软件本身存在bug,软件和系统版本不兼容,驱动尤其是显卡驱动出错,电脑配置 ...
- tomcat闪退没有报错_Appium在Android平台几种常见报错的解决方案
在Appium测试中,初学者也许会遇到以下报错或者问题: 1.urllib2.URLError: Appium运行中报错如上,有两种可能: (1)发现是由于自己手机上连接了代理,去掉代理,以上报错消失 ...
最新文章
- 标记-整理(Mark-Compact)
- redis深度历险_Redis的数据结构(内存具体怎么优化的)
- 女程序员在这里落脚啦
- free 显示系统内存的使用情况
- matlab中文免费版下载以及安装教程(超详细)
- MASM入门(二)MASM基本语法
- gradle dependsOn等记录玩转。
- 八爪鱼数据采集教程(一)
- win7找回快速启动栏
- UVa 12118 Inspector's Dilemma
- censo7安装mysql_centos7环境下在线安装mysql
- 单片机及接口课程设计报告-------基于音乐播放器
- 1047: 阿姆斯特朗数
- Python程序设计题库——第二章
- 基于SHCAN智能仪表的ECU检测系统ETest的开发
- 图文并茂详尽剖析圆排列问题
- Python机器学习-多元分类的5种模型
- C语言作业银行ATM系统,C语言银行存取款管理系统
- 江水平:我是如何通过互联网做装修生意的
- linux卸载先驱的命令是,【单选题】在Linux中,若要在同一行书写多条命令,命令之间应使用符号()分隔A. 转义字符\\ B. 分号; C. , D. 空格...