Android 7.0手机打开相机或相册报错解决方案
2017-11-28 11:36
363 查看
原文地址:http://www.jianshu.com/p/edec55192944
在android 7.0以上的手机上打开相机、相册会报如下错误:
android.os.FileUriExposedException: ** exposed beyond app through Intent.getData()
产生原因:
在Android7.0系统上,Android 框架强制执行了 StrictMode API 政策禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常,如调用系统相机拍照,或裁切照片。
解决方法:
官方的解决方法(https://developer.android.google.cn/training/secure-file-sharing/setup-sharing.html)
1、在manifest清单文件中注册provider
2、指定共享目录
在res下新建xml文件夹,新建file_paths.xml文件
上述代码中 path="" ,是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为 path="pictures" ,那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
3、使用FileProvider
以打开相机为例(相册类似):
作者:满天星爱我
链接:http://www.jianshu.com/p/edec55192944
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在android 7.0以上的手机上打开相机、相册会报如下错误:
android.os.FileUriExposedException: ** exposed beyond app through Intent.getData()
产生原因:
在Android7.0系统上,Android 框架强制执行了 StrictMode API 政策禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常,如调用系统相机拍照,或裁切照片。
解决方法:
官方的解决方法(https://developer.android.google.cn/training/secure-file-sharing/setup-sharing.html)
1、在manifest清单文件中注册provider
<!--android7.0拍照 需要注册FileProvider--> <provider android:name="android.support.v4.content.FileProvider" android:authorities="包名.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>也就是在application内加了一个provider,其中,name是固定的,android:authorities是你的应用报名+“.fileprovider”,其实这里不一定要写fileprovider,可以随便写,只是要与后面FileProvider.getUriForFile()这个方法中的第二个参数authority对应起来即可。android:grantUriPermissions固定true,表示uri访问授权,android:exported固定的false,android:resource表示我们app要共享文件的路径的资源文件.
2、指定共享目录
在res下新建xml文件夹,新建file_paths.xml文件
<paths> <external-path name="external_files" path="."/> </paths>为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件。
上述代码中 path="" ,是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为 path="pictures" ,那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
3、使用FileProvider
以打开相机为例(相册类似):
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (Build.VERSION.SDK_INT >= 24) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //24以上使用FileProvider intent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getContext(), "包名.fileprovider", mTmpFile)); }else{ //24以下 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile)); }
作者:满天星爱我
链接:http://www.jianshu.com/p/edec55192944
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- JS中兼容实现android和ios系统手机打开相机并可选择相册功能
- JS中调用android和ios系统手机打开相机并可选择相册功能
- android 调用系统相册选取照片或者打开相机拍照获取图片,返回时回到手机桌面,然后才会跳转到当前activity
- Android 打开相机获得路径:注意三星手机图片方向问题。
- android调用系统相册选图或相机拍照后对图片进行剪切无内存溢出支持7.0
- 兼容Android 7.0/6.0 启动系统相机/相册 选择图片方法
- Android 7.0调用相机,相册,裁剪的相关改进
- Android手机访问相册和打开照相机
- Android 7.0及以上打开相机,裁剪问题(私有文件的访问权限)
- Unity 3D 读取android 本地相册打开相机
- Android 7.0 打开相机闪退问题
- Android 7.0+相机、相册、裁剪适配问题
- 兼容7.0下载安装及打开相机相册适配问题记录
- Android WebView中打开相机拍照和选择相册
- Android调用手机相机和相册拿到图片保存上传
- Android 中打开相册图片 使用相机拍摄并存储照片
- Android 调用相机、打开相册、裁剪图片
- [Android] 调用相机、打开相册、裁剪图片
- Android webview支持type="file" 打开相机和相册兼容5.0+