针对“Android11及以上文件读写权限申请详细介绍”的完整攻略,我将会从以下几个方面进行介绍:
- Android 11及以上文件读写权限简介
- 权限申请流程
- 示例说明
- 总结
1. Android 11及以上文件读写权限简介
从 Android 11 开始,应用程序需要获得存储权限才能访问外部存储设备上的文件。存储空间的使用分为两种类型:应用内部存储和外部存储。应用内部存储包含应用的私有文件目录,而外部存储包含用户可以在应用之间共享的文件目录。
在 Android 11 之前,应用可以使用以下任何机制来访问存储,不需要授予存储权限:
- 应用内部存储
- MediaStore API
- 外部存储的传统API
但是在 Android 11 及以上版本中,应用程序必须先向用户申请访问外部存储设备的权限,而且规则有所改变。如果应用未获得必要的权限,则将视为未经授权地访问存储空间,并且可能会导致应用在设备上的限制。
2. 权限申请流程
下面是针对 Android 11及以上版本文件读写权限的申请流程:
- 在应用清单中声明需要权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 对于 Android 11 及以上的设备,您还需要在应用清单文件中添加以下代码:
<application
android:requestLegacyExternalStorage="true">
</application>
- 检查权限是否已经获得,如下所示:
if (ContextCompat.checkSelfPermission(
context, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED) {
// Permission is not granted, request it
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
}
- 处理权限请求结果:
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE) {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission has been granted, write your code
} else {
// Permission denied, handle it
}
}
}
3. 示例说明
示例1:使用 DocumentFile 来访问外部存储
只有在用户授予了外部存储访问权限时,才能使用 DocumentFile API。
可以使用以下代码在Android 11及以上设备上的共享目录中创建文件夹:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, "My folder");
values.put(MediaStore.MediaColumns.MIME_TYPE, DocumentsContract.Document.MIME_TYPE_DIR);
Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
if (uri != null) {
DocumentFile documentFile = DocumentFile.fromSingleUri(this, uri);
documentFile.createDirectory("My subfolder");
}
}
示例2:使用 SAF 选择导出文件
即使用户未授权您的应用程序访问外部存储,您的应用程序也可以使用以下示例代码选择导出的文件。
final Intent exportIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(exportIntent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_OPEN_DOCUMENT_TREE && resultCode == RESULT_OK) {
Uri treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
exportFile(pickedDir);
}
}
private void exportFile(DocumentFile pickedDir) {
// Your export code here
}
4. 总结
以上是 Android 11及以上文件读写权限的申请流程和两个示例。在开发需要访问外部存储的应用时,请务必考虑到这些更改,以便提供更好的用户体验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android11及以上文件读写权限申请详细介绍 - Python技术站