Android Q(API 级别 29)引入了一个新的存储模型,称为“作用域存储”(Scoped Storage)。这个模型的主要目的是为了更好地保护用户的隐私和数据安全,通过限制应用程序对存储空间的访问权限。
原因:Android Q引入了作用域存储模型,限制了应用程序对存储空间的访问权限。为了保护用户隐私,应用程序需要显式请求访问存储空间的权限。
解决方法:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
}
MediaStore
API来访问媒体文件,而不是直接访问文件路径。ContentResolver contentResolver = getContentResolver();
Uri collection;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
} else {
collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
Cursor cursor = contentResolver.query(collection, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
// 处理图片
}
cursor.close();
}
<application
android:requestLegacyExternalStorage="true"
...>
...
</application>
通过以上方法,可以有效地解决Android Q中请求许可才能访问所有存储空间的问题,并确保应用程序的兼容性和数据安全。
领取专属 10元无门槛券
手把手带您无忧上云