Android7.0适配事项
概述
Android每发一个新版本都多多少少要去做适配的工作,7.0已经出来那么久了,也需要总结下相关的适配事项,要不8.0正式发布后再来记录就真的有点晚了。来看看这一年适配遇到的问题及解决办法吧。
先罗列下开发中遇到的问题(后续有遇到再添加):
- 文件访问权限
- v2签名问题
文件访问权限
Android现在也越来越重视安全性的问题了,并加大了对隐私的保护力度,这是往好的方向发展。在Android6.0时就引入了动态权限控制(Runtime Permissions),可以让用户很好的管理应用权限了,不再依赖第三方的全家桶。在Android7.0又为用户带来更加安全的操作系统,应用私有目录将被限制访问,最大的影响就是文件共享不能再使用file://这样的uri去分享访问了,会报FileUriExposedException错误。官方也提供了新的类来解决此问题,这个类就是FileProvider。
这个新特性影响的模块有:
- 照相功能
- 应用间的文件共享
因为照相会生成一个文件uri,这里是file://类型的uri,之前的文件访问了是如此,需要用FileProvider把它改成content://类型的进行访问。
来看下FileProvider的使用吧
首先要在Manifest中注册provider:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.dylan.demo.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/paths" />
</provider>
android:resource的值是自定义的一个xml文件,里面指定了可以访问的目录,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<files-path name="internal_files" path="/"/>
<external-path name="external" path="/files" />
<cache-path name="internal_cache" path="/" />
</paths>
</resources>
这里说明下paths的配置:
- <files-path/>代表的根目录: Context.getFilesDir()
- <external-path/>代表的根目录: Environment.getExternalStorageDirectory()
- <cache-path/>代表的根目录: getCacheDir()
path的值可以指定为根目录或指定的子目录。
看官方例子的使用:
File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
其实就是使用FileProvider的getUriForFile静态方法去做一个转换,转换成content://类型的uri。
另一个要注意的就是当使用intent带file uri时,要添加临时访问权限:
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
关于FileProvider就介绍到这里了,还有不明白的可以多看看官方的文档。
APK Signature Scheme v2
Android 7.0引入了全新的 APK Signature Scheme v2。这是加强对包的校验,启动了新的签名后,像美团的多渠道打包方案在7.0机器上就会报错了,我们当时就遇到了这个问题。
解决的办法也很简单,官方提供了关闭v2签名的方法,只需要在gradle上配置一下即可:
signingConfigs {
release {
.......
v2SigningEnabled false
}
}
在signingConfigs中增加关闭配置即可。