
对 Android Q Beta 6 版本上的存储示例,进行一次测试分析并记录
前言
官方给出: Android Q 会继续使用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限,这些权限与面向用户的存储运行时权限相对应。不过,默认情况下,以 Android Q 为目标平台的应用(以及选择接受这些变更的应用)在访问外部存储设备中的文件时会进入过滤视图。此类应用只能查看特定于应用的目录和特定类型的媒体,因此应用无需请求任何其他用户权限。
环境
编译环境:Ubuntu 19.04 、Android Studio 3.4.2、compileSdkVersion 29、buildToolsVersion “29.0.1”、 targetSdkVersion 29
运行环境:Pixel 2 、Android Version 10 (QPP6.190730.005) 、API 29
过程
效果
界面上有两个按钮,一个写入内容到文件存储,一个是从存储读取文件内容
测试分类
类别 1 传统目录方式
1 | /** |
不加读写权限
清单文件不添加如下权限,也没有动态请求代码
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
失败,程序异常
1 | 2019-08-13 00:42:47.945 9976-9976/com.xw.androidqtest D/StorageActivity: file.exists():false , file.getAbsolutePath(): /storage/emulated/0/测试Android Q文件.txt |
加读写权限但不动态请求
清单文件添加如下权限,但不动态请求
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
失败,程序异常
1 | 2019-08-13 00:47:52.759 11693-11693/com.xw.androidqtest D/StorageActivity: file.exists():false , file.getAbsolutePath(): /storage/emulated/0/测试Android Q文件.txt |
加读写权限但并动态请求
清单文件添加如下权限,并动态请求
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
1 |
|
失败,程序异常
1 | 2019-08-13 00:53:45.690 13471-13471/com.xw.androidqtest D/StorageActivity: file.exists():false , file.getAbsolutePath(): /storage/emulated/0/测试Android Q文件.txt |
类别 2 特定目录方式
1 | /** |
不加读写权限
清单文件不添加如下权限,也没有动态请求代码
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
成功,程序正常运行
1 | 2019-08-13 01:01:40.653 14721-14721/com.xw.androidqtest D/StorageActivity: file.exists():false , file.getAbsolutePath(): /storage/emulated/0/Android/data/com.xw.androidqtest/files/Documents/测试Android Q文件.txt |
查看设备上应用详情的相关权限模块,并没有相应的权限请求
加读写权限但不动态请求
清单文件添加如下权限,但不动态请求
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
成功,程序正常运行
1 | 2019-08-13 01:12:22.104 18040-18040/com.xw.androidqtest D/StorageActivity: file.exists():true , file.getAbsolutePath(): /storage/emulated/0/Android/data/com.xw.androidqtest/files/Documents/测试Android Q文件.txt |
查看设备上应用详情的相关权限模块,有相应的存储权限请求,为拒绝状态
加读写权限但并动态请求
清单文件添加如下权限,并动态请求
1 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
1 |
|
成功,程序正常运行
1 | 2019-08-13 01:16:06.530 19535-19535/com.xw.androidqtest D/StorageActivity: 申请成功 |
结论
1.Android Q 如果调用Environment.getExternalStorageDirectory(),需要添加READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限,并动态请求权限,同时还需要添加新的清单属性为requestLegacyExternalStorage,否则会出现类别1的测试结果
1 | <manifest ... > |
这样添加完成之后,getExternalStorageDirectory方式就能执行成功了。
2、Android Q 如果调用Environment.getExternalFilesDir()。正如官方所言,默认情况下,以 Android Q 为目标平台的应用(以及选择接受这些变更的应用)在访问外部存储设备中的文件时会进入过滤视图。此类应用只能查看特定于应用的目录和特定类型的媒体,因此应用无需请求任何其他用户权限。(类别2测试示例体现)
以上内容简单的对Android Q 存储方式进行简单的示例说明。如果有不足之处,欢迎指正。