Android7.0的适配异常
来源:互联网 发布:360剑雨江湖进阶数据 编辑:程序博客网 时间:2024/06/08 08:54
工作的时候发现几个异常,在此总结一下
1、私有文件的文件权限不在放权给所有的应用,使用 MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE 进行的操作将触发 SecurityException。
2、给其他应用传递 file:// URI 类型的Uri,可能会导致接受者无法访问该路径。 因此,在Android7.0中尝试传递 file:// URI 会触发 FileUriExposedException。
3、调用相机时会触发 FileUriExposedException。
这都是由于Android7.0执行了“StrictMode API 政策禁”的原因
借鉴博客:http://www.jianshu.com/p/56b9fb319310
使用FileProvider
使用FileProvider的大致步骤如下:
第一步:在manifest清单文件中注册provider
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.jph.takephoto.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /></provider>
心得:exported:要求必须为false,为true则会报安全异常。grantUriPermissions:true,表示授予 URI 临时访问权限。
第二步:指定共享的目录
为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件,内容如下:
<?xml version="1.0" encoding="utf-8"?><resources> <paths> <external-path path="" name="camera_photos" /> </paths></resources>
- <files-path/>代表的根目录: Context.getFilesDir()
- <external-path/>代表的根目录: Environment.getExternalStorageDirectory()
- <cache-path/>代表的根目录: getCacheDir()
心得:上述代码中
path=""
,是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为path="pictures"
,
那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
第三步:使用FileProvider
上述准备工作做完之后,现在我们就可以使用FileProvider了。
还是以调用系统相机拍照为例,我们需要将上述拍照代码修改为如下:
File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");if (!file.getParentFile().exists())file.getParentFile().mkdirs();Uri imageUri = FileProvider.getUriForFile(context, "com.jph.takephoto.fileprovider", file);//通过FileProvider创建一个content类型的UriIntent intent = new Intent();intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URIstartActivityForResult(intent,1006);
上述代码中主要有两处改变:
- 将之前Uri的scheme类型为file的Uri改成了有FileProvider创建一个content类型的Uri。
- 添加了
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
来对目标应用临时授权该Uri所代表的文件。
心得:上述代码通过
FileProvider
的Uri getUriForFile (Context context, String authority, File file)
静态方法来获取Uri,该方法中authority
参数就是清单文件中注册provider的android:authorities="com.jph.takephoto.fileprovider"
。
对Web服务器如tomcat,IIS比较熟悉的小伙伴,都只知道为了网站内容的安全和高效,Web服务器都支持为网站内容设置一个虚拟目录,其实FileProvider
也有异曲同工之处。
将getUriForFile
方法获取的Uri打印出来如下:
content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg`。
其中camera_photos
就是file_paths.xml
中paths的name。
因为上述指定的path为path=""
,所以content://com.jph.takephoto.fileprovider/camera_photos/
代表的真实路径就是根目录,即:/storage/emulated/0/
。content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg
代表的真实路径是:/storage/emulated/0/temp/1474960080319.jpg
。
另外,推荐大家使用开源工具库TakePhoto,
TakePhoto是一款在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库。
- Android7.0的适配异常
- Android7.0的适配
- Android7.0 自动更新适配,包解析异常
- Android7.0异常:FileUriExposedException
- Android7.0中PopupWindow的showAsDropDown异常问题
- Android7.0拍照失败FileUriExposedException异常的解决
- Android7.0适配心得
- Android7.0 适配心得
- Android7.0适配心得
- Android7.0权限适配
- Android7.0适配总结
- Android7.0适配所需要注意的一些事项
- Android7.0适配的一些小心得
- Android7.0 安装apk更新包的适配
- Android7.0 安装apk更新包的适配
- Android7.0的FileProvider
- Android7.0解析包异常解决办法
- android7.0打开相册报FileUriExposedException异常
- socket编程理解
- 浅析C++中的this指针
- cocos2d怎么设置屏幕朝向?横屏 or 竖屏设置
- ELF文件研究
- 特征组合相关资源总结
- Android7.0的适配异常
- 配置java环境变量遇到的一个问题
- ISP 图像传感器camera原理
- C语言内存管理:malloc、calloc、free的实现
- Java判断回文字符串
- 挑客 客服语录
- HTML常用标记、CSS三种选择器
- opencv导入txt数据,画两幅图像的匹配点(像素精度)
- [Leetcode 123] Best Time to Buy and Sell Stock III