返回
安卓Q及以上:读取自创建文件为什么需要权限?如何获取?
Android
2024-03-12 09:12:43
安卓Q及以上:读取自创建文件需要权限吗?
问题背景
在安卓Q之前的版本中,启用存储权限后,应用可以无限制地访问外部存储上的所有文件。然而,从安卓Q(SDK-28)开始,文件系统引入重大变革,对应用对文件和目录的访问方式产生了重大影响。
重新安装应用后获取自创建文件
在安卓Q中,一旦清除存储或重新安装应用,应用将不再能够访问其先前创建的文件,除非重新授予访问权限。
解决方案:请求读取权限
要在重新安装应用后读取自创建的文件,应用需要请求 READ_EXTERNAL_STORAGE
权限。
请求权限代码示例
以下是请求权限的代码示例:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE_READ_EXTERNAL_STORAGE);
处理权限请求结果
在用户做出决定后,应用需要在 onRequestPermissionsResult()
方法中处理权限请求结果。如果权限被授予,应用就可以访问外部存储并读取自创建的文件。
获取下载文件夹中的PDF文件
要从安卓Q及以上的下载文件夹中获取所有PDF文件,应用需要使用 MediaStore
API:
ContentResolver cr = context.getContentResolver();
String[] projection = {MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.DISPLAY_NAME};
String selectionMimeType = MediaStore.Files.FileColumns.MIME_TYPE + "=?";
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf");
String[] selectionArgsPdf = new String[]{mimeType};
Cursor cursor = cr.query(extUri, projection, selectionMimeType, selectionArgsPdf, sortOrder + " DESC");
常见问题解答
1. 重新安装应用后,应用需要请求权限吗?
是的,在安卓Q及以上版本中,应用在重新安装后需要请求 READ_EXTERNAL_STORAGE
权限才能读取自创建的文件。
2. 所有应用都需要请求读取权限吗?
只有在需要访问外部存储和读取自创建文件的情况下,应用才需要请求读取权限。
3. 如何检查应用是否具有读取权限?
可以使用 ContextCompat.checkSelfPermission()
方法来检查应用是否具有指定的权限。
4. 为什么在安卓Q中引入这些文件系统更改?
安卓Q中的文件系统更改旨在增强用户隐私和数据安全。它限制了应用对外部存储的访问,从而降低了恶意应用窃取用户敏感信息的风险。
5. 我可以使用其他方法来访问自创建的文件吗?
除了请求读取权限外,应用还可以通过其他方法来访问自创建的文件,例如:
- 使用 Scoped Storage
- 在应用特定的目录中创建文件
- 请求其他权限(如
MANAGE_EXTERNAL_STORAGE
)