Android 7.0 行为变更 通过FileProvider在应用间共享文件吧
|
恩,之所以不需要权限,主要是因为Intent的action为ACTION_IMAGE_CAPTURE,当我们startActivity后,会辗转调用Instrumentation的execStartActivity方法,在该方法内部,会调用intent.migrateExtraStreamToClipData();方法。 该方法中包含:
![]() 可以看到将我们的EXTRA_OUTPUT,转为了setClipData,并直接给我们添加了WRITE和READ权限。
因为addFlags主要用于setData,setDataAndType以及setClipData(注意:4.4时,并没有将ACTION_IMAGE_CAPTURE转为setClipData实现)这种方式。 所以addFlags方式对于ACTION_IMAGE_CAPTURE在5.0以下是无效的,所以需要使用grantUriPermission,如果是正常的通过setData分享的uri,使用addFlags是没有问题的(可以写个简单的例子测试下,两个app交互,通过content://)。 5 总结下 终于将知识点都涵盖到了~ 总结下,使用content://替代file://,主要需要FileProvider的支持,而因为FileProvider是ContentProvider的子类,所以需要在AndroidManifest.xml中注册;而又因为需要对真实的filepath进行映射,所以需要编写一个xml文档,用于描述可使用的文件夹目录,以及通过name去映射该文件夹目录。 对于权限,有两种方式:
相比来说方式二较为麻烦,因为需要指定目标应用包名,很多时候并不清楚,所以需要通过PackageManager进行查找到所有匹配的应用,全部进行授权。不过更为稳妥~ 方式一较为简单,对于intent.setData,setDataAndType正常使用即可,但是对于setClipData,由于5.0前后Intent#migrateExtraStreamToClipData,代码发生变化,需要注意~ 好了,看到现在是不是觉得适配7.0挺麻烦的,其实一点都不麻烦,下面给大家总结一种快速适配的方式。 6 快速完成适配 (1)新建一个module 创建一个library的module,在其AndroidManifest.xml中完成FileProvider的注册,代码编写为:
![]() 注意一点,android:authorities不要写死,因为该library最终可能会让多个项目引用,而android:authorities是不可以重复的,如果两个app中定义了相同的,则后者无法安装到手机中(authority conflict)。 同样的的编写file_paths~
![]() 最后再编写一个辅助类,例如:
![]() 可以根据自己的需求添加方法。 好了,这样我们的一个小库就写好了~~ (2)使用 如果哪个项目需要适配7.0,那么只需要这样引用这个库,然后只需要改动一行代码即可完成适配啦,例如: 拍照
![]() 只需要改动 Uri fileUri = FileProvider7.getUriForFile(this, file); 即可。 安装apk 同样的修改setDataAndType为: FileProvider7 .setIntentDataAndType(this, intent, "application/vnd.android.package-archive", file, true); 即可。 ok,繁琐的重复性操作终于简化为一行代码啦~ 具体的示例和代码我放github了:
如果你有想学习的文章直接留言,我会整理征稿。如果你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可。 责任编辑: (编辑:52刷机网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |









