Android 7.0 适配 排bug指南

安卓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 实现上的一些差别可能导致应用出问题.

他们都没告诉你适配 Android N 需要注意什么

你可能感兴趣的:(Android 7.0 适配 排bug指南)