持续创作,加速成长!这是我参与「掘金日新计划 · 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所代表的文件。