Android版本适配

194 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

Android 6

Android6中为提高用户安全性,引入了运行时权限。对部分高危权限进行进一步的限制。对于targetSDK不小于23的,我们不仅需要在AndroidManifest.xml中配置程序所需的权限,还需要在代码中手动申请运行时权限。

检查是否被授权

ContextCompat.checkSelfPermission(context,permission)

checkSelfPermission()方法返回查询结果

  • PackageManager.PERMISSION_DENIED 未授权
  • PackageManager.PERMISSION_GRANTED 已授权

请求授权

对于没有授权的权限需要进行权限申请。

ActivityCompat.requestPermissions(activity,permissions,requestCode);

授权回调

权限申请的结果并不是直接返回的,而是通过onRequestPermissionsResult进行回调的。

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

Android 7

Android 7我们程序向其他程序公开文件的时候一般都是使用file://url进行共享,但是这样可能会暴露我们的文件,为了提升安全性,Android 7中将这一方式禁止,如果需要共享文件,需要使用content://uri,并授予 URI 临时访问权限。

注册FileProvider

FileProvider是Android四大组件ContentProvider的子类,所以必须在AndroidManifest.xml进行注册。

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.fileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/provider_paths" />
</provider>

定义共享文件路径

通过provider的meta-data节点配置共享文件路径信息所在的文件(xml/provider_paths)

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="file" path=""/>
    <cache-path name="file" path=""/>
    <external-path name="external" path=""/>
    <external-files-path name="external-files" path=""/>
    <external-cache-path name="external-cache" path=""/>
</paths>
  • files-path:内部存储空间应用私有目录下的files目录,即Context.getFilesDis()路径。
  • cache-path:内部存储空间应用私有目录下的cache目录,即Context.getCacheDir()路径。
  • external-path:外部存储空间根目录,即Environment.getExternalStorageDirectory()路径。
  • external-files-path:外部存储空间应用私有目录下的files目录,即Context.getExternalFilesDir()路径。
  • external-cache-path:外部存储空间应用私有目录下的cache目录,即Context.getExternalCacheDir()路径。

共享文件

val imageUri = FileProvider.getUriForFile(this,"${pkgName}.fileprovider", file)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

首先通过FileProvider.getUriForFile()方法生成Uri,然后对目标应用临时授权该Uri所代表的文件。