Android 10.0引入了Scoped Storage,是一种新的文件存储方式,用于提高应用程序的数据隐私和安全性。下面是一个包含代码示例的解决方法,用于在Android 10.0上使用Scoped Storage。
首先,确保您的应用程序的minSdkVersion设置为29或更高版本。
...
此属性将允许您的应用程序继续访问外部存储上的共享目录。
您还需要在运行时请求这些权限。可以使用以下代码示例请求权限:
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
public void verifyStoragePermissions(Activity activity) {
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_EXTERNAL_STORAGE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予,可以访问外部存储
} else {
// 权限被拒绝,无法访问外部存储
}
}
}
private static final int REQUEST_PICK_IMAGE = 2;
private ImageView imageView;
public void pickImageFromGallery() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_PICK_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_PICK_IMAGE && resultCode == RESULT_OK && data != null) {
Uri imageUri = data.getData();
imageView.setImageURI(imageUri);
}
}
这是一个基本的示例,您可以根据您的应用程序需求进行调整和扩展。请注意,Scoped Storage还具有其他功能,例如使用SAF(Storage Access Framework)访问文件,创建私有存储区等。
注意:在Android 11及更高版本中,Scoped Storage成为默认文件存储方式,无需添加android:requestLegacyExternalStorage属性。