android7.0调用拍照及获取相册,遇到的一些问题
来源:互联网 发布:php url加密 编辑:程序博客网 时间:2024/05/18 20:48
问题1.android 7.0 因为file://引起的FileUriExposedException异常
7.0以前的版本
String path = ImageUtil.getSDCardPath();
File file = new File(path + "/" + System.currentTimeMillis() + ".jpg");
imageUri = Uri.fromFile(file);
这个file文件直接非常简单的转换成uri格式
android.os.FileUriExposedException: file:///XXX exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
7.0之后的版本
当把targetSdkVersion指定成24及之上并且在API>=24的设备上运行时。这种方式则会出现FileUriExposedException异常
原因:
Android不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法。原因在于使用file://Uri会有一些风险,比如:
文件是私有的,接收file://Uri的app无法访问该文件。在Android6.0之后引入运行时权限,如果接收file://Uri的app没有申请READ_EXTERNAL_STORAGE权限,在读取文件时会引发崩溃。
因此,google提供了FileProvider,使用它可以生成content://Uri来替代file://Uri。
解决方案:
首先在AndroidManifest.xml中添加provider android:authorities是用来标识provider的唯一标识,在同一部手机上一个"authority"串只能被一个app使用,冲突的话会导致app无法安装。
android:exported必须设置成false,后面异常会讲为什么android:grantUriPermissions用来控制共享文件的访问权限,也可以在java代码中设置。
<!--处理7.0以上获取拍照相册uri兼容问题-->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.glorystudent.golflife.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
添加在<application 之内
@xml/provider_paths 这是指定路径和转换规则:res/xml/provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="diary sdcard/photo"/>
<external-path path="" name="camera_photos" />
<external-path name="my_images" path="Android/data/com.example.wmz.network/files/Pictures/" />
<external-path name="images" path="Pictures/" />
<external-path name="dcim" path="DCIM/" />
<root-path
name="root_path"
path="." />
</paths>
修改代码:
imageUri = FileProvider.getUriForFile(this, FriendChatActivity.this.getPackageName() + ".fileprovider", file);
可能出现的问题:
1.java.lang.SecurityException: Provider must not be exported
解决方案:android:exported必须设置成false
2.Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
解决方案:AndroidManifest.xml处的android:authorities必须跟mActivity.getPackageName() + ".fileprovider"一样
- android7.0调用拍照及获取相册,遇到的一些问题
- Android7.0调用系统相机拍照、访问相册问题。
- Android7.0调用系统相机拍照、访问相册问题。
- android调用拍照相册遇到的问题
- Android7.0的相机相册遇到问题
- Android7.0 调用相机拍照并裁剪及遇到的坑
- Android7.0调用系统相机拍照、相册选择图片、裁剪
- Android7.0调用摄像头拍照崩溃的问题
- Android 调用系统相机拍照并且显示在相册中,以及中间可能会遇到的一些问题的解决
- Android拍照和从相册获取图片(解决android7.0打开相机崩溃的问题),同时也解决了拍完照后图片方向不正的问题
- Android7.0及以上 拍照crash问题
- android 调用系统api拍照遇到的一些问题
- 详解Android7.0及以上版本拍照或者相册选取照片包括裁剪照片时时App崩溃问题
- Android7.0在蓝牙开发中遇到的一些问题
- Android7.0调用系统相机拍照、读取系统相册照片+CropImageView剪裁照片
- Android7.0调用系统相机拍照、读取系统相册照片+CropImageView剪裁照片
- Android7.0调用系统相机拍照、读取系统相册照片+CropImageView剪裁、旋转、翻转照片
- Android7.0调用系统相机拍照、相册选择图片、裁剪 图片压缩
- 合并查询和为表或字段取别名
- h5大番薯12牛牛平台单卖一条龙
- 三星S6 9209刷机 root 完全教程
- spark中出现org.apache.htrace找不到的错误
- JavaScript自习笔记(兼容性)
- android7.0调用拍照及获取相册,遇到的一些问题
- PAT (Advanced Level) Practise 1132Cut Integer (20)
- web项目的getContextPath()
- 第十三节、给webpack增加babel支持
- vim配置utf-8
- SPEED 飞车扩容改造:敢于对过去说不
- 小程序之全局变量赋值
- 在<c:foreach 里面调用js代码
- 线上问题:nginx日志打印时间问题