一、前言
Android 7.0 Nougat 提供新功能以提升性能、生产效率和安全性。主要新增了一些特性和优化。
关于Android 7.0特性的介绍,网上有很多不错的博客,比如-> https://blog.csdn.net/wulianghuan/article/details/59112049
在此,就不详细列举,仅做自我总结一下,重点在适配上,便于日后查阅。
二、几个重要特性
1、通知
Android N 增加了许多新的notifications API,进行了重新的设计,引入了新的风格。
2、多窗口支持(分屏模式)。
手机和平板用户可以并排运行两个应用。
3、随时随地低电耗模式
在 Android N 中,低电耗模式又前进了一步,随时随地可以省电。只要屏幕关闭了一段时间,且设备未插入电源,低电耗模式就会对应用使用熟悉的 CPU 和网络限制
4、快速的应用安装路径
Android 运行组件的 JIT 编译器最实际的好处之一是应用安装和系统更新的速度。即使在Android 6.0 中需要几分钟进行优化和安装的大型应用,现在只需几秒钟就可以完成安装。
5、Project Svelte:后台优化
Android N 删除了三项隐式广播 CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO ,以帮助优化内存使用和电量消耗。
6、Data Saver
Android N推出了Data Saver模式,这是一项新的系统服务,有助于减少应用使用的蜂窝数据,无论是在漫游,账单周期即将结束,还是使用少量的预付费数据包。
7、号码屏蔽
Android N 现在支持在平台中进行号码屏蔽,提供框架 API,让服务提供商可以维护屏蔽的号码列表。默认短信应用、默认手机应用和提供商应用可以对屏蔽的号码列表进行读取和写入操作,其他应用则无法访问此列表。
8、密钥认证
为了让硬件支持的密钥库使用起来更简单和更安全,Android N 引入了密钥认证。应用和关闭的设备可使用密钥认证以坚决地确定 RSA 或 EC 密钥对是否受硬件支持、密钥对的属性如何,以及其使用和有效性有何限制。
三、Android N 适配
1、文件访问权限
随着Android版本越来越高,Android对隐私的保护力度也越来越大。Android 6.0引入了动态权限控制,Android 7.0则“限制访问应用私有目录”。
最大的影响就是文件共享不能再使用file://这样的uri去分享访问了,会报FileUriExposedException错误。因此,官方提供了新的类--FileProvider 来解决此问题
主要影响场景功能:1)拍照功能,裁剪图片 2)点击通知栏安装APP无反应
FileProvider 使用步骤:
1)在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 临时访问权限。
2)指定共享的目录
为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path path="" name="camera_photos" />
</paths>
</resources>
上述代码中path=”“,是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为path=”pictures”,
那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。
3)使用FileProvider
以调用系统相机拍照为例,
在Android7.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);//将拍取的照片保存到指定URI
startActivityForResult(intent,1006);
在Android7.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)
在Android N上,使用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类型的Uri
Intent 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);//将拍取的照片保存到指定URI
startActivityForResult(intent,1006);
上述代码中主要有两处改变:
1、将之前Uri的scheme类型为file的Uri改成了有FileProvider创建一个content类型的Uri。
2、添加了intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);来对目标应用临时授权该Uri所代表的文件。
2、v2签名问题
Android 7.0引入了全新的 APK Signature Scheme v2。这是加强对包的校验,启动了新的签名后,有时候打包会在7.0机器上报错,解决方法是:在gradle上配置一下,关闭v2签名,在signingConfigs中增加关闭配置。
signingConfigs {
release {
.......
v2SigningEnabled false
}
}
本文内容转自:
https://blog.csdn.net/wulianghuan/article/details/59112049
https://blog.csdn.net/qq_35100676/article/details/70670172
感谢!