7.0Android知识Android开发

Android7.0适配事项

2017-04-20  本文已影响279人  dylanhuang88

概述

Android每发一个新版本都多多少少要去做适配的工作,7.0已经出来那么久了,也需要总结下相关的适配事项,要不8.0正式发布后再来记录就真的有点晚了。来看看这一年适配遇到的问题及解决办法吧。

先罗列下开发中遇到的问题(后续有遇到再添加):

  1. 文件访问权限
  2. v2签名问题

文件访问权限

Android现在也越来越重视安全性的问题了,并加大了对隐私的保护力度,这是往好的方向发展。在Android6.0时就引入了动态权限控制(Runtime Permissions),可以让用户很好的管理应用权限了,不再依赖第三方的全家桶。在Android7.0又为用户带来更加安全的操作系统,应用私有目录将被限制访问,最大的影响就是文件共享不能再使用file://这样的uri去分享访问了,会报FileUriExposedException错误。官方也提供了新的类来解决此问题,这个类就是FileProvider。

这个新特性影响的模块有:

  1. 照相功能
  2. 应用间的文件共享

因为照相会生成一个文件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的配置:

  1. <files-path/>代表的根目录: Context.getFilesDir()
  2. <external-path/>代表的根目录: Environment.getExternalStorageDirectory()
  3. <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中增加关闭配置即可。

上一篇 下一篇

猜你喜欢

热点阅读