我只在Android 10中有一个图像权限的问题。我声明这个问题只在android 10中存在,事实上,android 11和android 9以及更早的版本都启用了写和读权限。
正如文档所说,在清单中我有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>,在应用程序中有android:requestLegacyExternalStorage="true"。
我的编译版本是30,目标是30。即使将目标版本恢复到29,我也得到了相同的结果。
通过intent插入文件:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
photoUri = activity.getContentResolver().insert(
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL),
contentValues
);
else
photoUri = activity.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues
);
final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
activity.startActivityForResult(intent, REQUEST_CAMERA_KEY);取而代之的是get是这样的:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != REQUEST_CAMERA_KEY || resultCode != RESULT_OK)
return;
// use ImageDecoder.decodeBitmap >= Build.VERSION_CODES.P
final Bitmap bitmap =BitmapProvider.getBitmap(contentResolver, photoUri);
Cursor cursor = contentResolver.query(photoUri, null, null, null, null);
String value = null;
if (cursor == null) {
value = photoUri.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
value = cursor.getString(idx);
}
cursor.close();
File file = new File(value);
// Android 9 and < true true
// Android 10 false false
// Android 11 true true
System.out.println(file.canRead() + " " + file.canWrite());
try {
final FileOutputStream fileOutputStream = new FileOutputStream(file); // Android 10 generate open failed: EACCES (Permission denied) exception
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}获取位图:
public Bitmap getBitmap(
final ContentResolver contentResolver,
final Uri photoUri){
Bitmap bitmap = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
final ImageDecoder.Source source = ImageDecoder.createSource(contentResolver, photoUri);
try {
bitmap = ImageDecoder.decodeBitmap(source);
} catch (IOException e) {
e.printStackTrace();
}
} else {
InputStream inputStream = null;
try {
inputStream = contentResolver.openInputStream(photoUri);
bitmap = BitmapFactory.decodeStream(inputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return bitmap;
}我需要一个解释,尽管我已经遵循了文档,也许还有一个解释。谢谢。
发布于 2021-02-04 17:09:42
如果您请求传统存储,则还必须获得存储权限:android:requestLegacyExternalStorage="true"
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />。
如果你的目标是API30,requestLegacyExternalStorage就不能工作。您需要将目标SDK设置为29或使用媒体存储API。
https://stackoverflow.com/questions/66042220
复制相似问题