Android7.0新特性,及Android N适配( 四 )


● 私有文件的文件权限不在放权给所有的应用 , 使用或进行的操作将触发。
应对策略:这项权限的变更将意味着你无法通过File API访问手机存储上的数据了 , 基于File API的一些文件浏览器等也将受到很大的影响 , 看到这大家是不是惊呆了呢 , 不过迄今为止 , 这种限制尚不能完全执行 。应用仍可能使用原生 API 或 File API 来修改它们的私有目录权限 。但是 , 官方强烈反对放宽私有目录的权限 。可以看出收起对私有文件的访问权限是将来发展的趋势 。
● 给其他应用传递 file:// URI 类型的Uri , 可能会导致接受者无法访问该路径 。因此 , 在.0中尝试传递 file:// URI 会触发 ion 。
应对策略:大家可以通过使用来解决这一问题 。
●不再按文件名分享私人存储的文件 。E在.0中被标记为, 旧版应用在访问 E时可能出现无法访问的路径 。面向N 或更高版本的应用在尝试访问 E 时会触发。
应对策略:大家可以通过.()来访问由公开的文件 。
三、应用间共享文件
在.0系统上 ,  框架强制执行了API 政策禁止向你的应用外公开 file:// URI 。如果一项包含文件 file:// URI类型 的离开你的应用 , 应用失败 , 并出现 ion 异常 , 如调用系统相机拍照 , 或裁切照片 。
应对策略:若要在应用间共享文件 , 可以发送 :// URI类型的Uri , 并授予 URI 临时访问权限 。进行此授权的最简单方式是使用 类 。如需有关权限和共享文件的更多信息 , 请参阅共享文件 。
● 给其他应用传递 file:// URI 类型的Uri , 可能会导致接受者无法访问该路径 。因此 , 在.0中尝试传递 file:// URI 会触发 ion 。
实例问题
调用系统相机拍照 , 裁切照片 。
在.0之前 , 如果你想调用系统相机拍照可以通过以下代码来进行:
File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");if (!file.getParentFile().exists())file.getParentFile().mkdirs();Uri imageUri = Uri.fromFile(file);Intent intent = new Intent();intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URIstartActivityForResult(intent,1006);
在.0上使用上述方式调用系统相拍照会抛出如下异常:
android.os.FileUriExposedException: file:storage/emulated/0/temp/1474956193735.jpg exposed beyond app through Intent.getData()at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)at android.net.Uri.checkFileUriExposed(Uri.java:2346)at android.content.Intent.prepareToLeaveProcess(Intent.java:8933)at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)at android.app.Activity.startActivityForResult(Activity.java:4223)...at android.app.Activity.startActivityForResult(Activity.java:4182)
闪退截图如下:

Android7.0新特性,及Android N适配

文章插图
这是由于.0执行了“ API 政策禁”的原因 , 不过小伙伴们不用担心 , 上文讲到了可以用来解决这一问题 , 
现在我们就来一步一步的解决这个问题 。
使用
使用的大致步骤如下:
第一步:在清单文件中注册