安卓7.0再增加新功能的同时,改变了很多地方,官方的指南有
Android 7.0 行为变更
本文将大概描述其中涉及的几个变更,也是笔者近日在适配Android时碰到的问题,具体到每个变更的差异,恕不在此详述
在应用间共享文件
对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode
API 政策禁止在您的应用外部公开 file://
URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException异常。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。如需了解有关权限和共享文件的详细信息,请参阅共享文件。
(来自 Android 7.0 行为变更)
常见的出错例子有:
File file = new File("/storage/emulated/0/test.txt");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "text/*");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); // Crashes on this line
代码中通过Intent传递一个file://开头的Uri给照片浏览程序,在7.0上 启动intent的时候崩溃了,
报错如下
android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()
原因即在于获取Uri的时候 使用了 Uri.fromFile(file) 而不是 FileProvider.getUriForFile()
具体解决方案见 StackOverflow
简而言之 ,安卓7.0增加了对应用间共享文件的管控,对于共享文件的访问必须通过ContentProvider
其他重要说明
- ................
- 名为 Crypto 的 JCA 提供程序已弃用,因为它仅有的 SHA1PRNG 算法为弱加密。应用无法再使用 SHA1PRNG(不安全地)派生密钥,因为不再提供此提供程序。如需了解详细信息,请参阅博文 Android N 中已弃用“Crypto”安全提供程序。
- ................
但是并不止如此,安卓官方所提到的行为变更,在此看来似乎只是新的特性以及新的规定,要知,Google在安卓7.0之后逐渐修改了JDK的版本,有
在 N 中 Google 采用 OpenJDK 8 作为 Java 的实现,在 Java 实现上的一些差别可能导致应用出问题.