Android 11引入了作用域存储(Scoped Storage)权限模型,旨在更好地管理应用程序对文件的访问权限,提高用户数据的隐私性和安全性。作用域存储通过限制应用程序对存储的访问范围,使得每个应用程序只能访问其自己的文件,除非明确获得用户的授权。
Android 11的作用域存储权限主要包括以下几种类型:
getExternalFilesDir()
和getExternalCacheDir()
。问题1:如何请求作用域存储权限?
在Android 11中,应用程序需要显式请求作用域存储权限。可以通过以下步骤实现:
AndroidManifest.xml
中声明所需的权限:AndroidManifest.xml
中声明所需的权限:问题2:如何访问共享媒体文件?
可以使用MediaStore API访问共享媒体文件。以下是一个示例代码:
Uri collection;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else {
collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon().appendQueryParameter("images", "true").build();
}
Cursor cursor = getContentResolver().query(collection, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
Uri uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
// 处理文件
}
cursor.close();
}
问题3:如何使用Storage Access Framework?
可以使用Storage Access Framework让用户选择文件或目录,并授予应用程序访问权限。以下是一个示例代码:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE);
在onActivityResult
中处理返回的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
if (resultData != null) {
Uri uri = resultData.getData();
// 处理文件
}
}
}
通过以上内容,您可以更好地理解Android 11作用域存储权限的基础概念、优势、类型、应用场景以及常见问题的解决方法。
领取专属 10元无门槛券
手把手带您无忧上云