首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓10 MediaStore文件权限

安卓10 MediaStore文件权限
EN

Stack Overflow用户
提问于 2021-02-04 16:52:31
回答 1查看 751关注 0票数 1

我只在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插入文件:

代码语言:javascript
复制
    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是这样的:

代码语言:javascript
复制
@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();
    }
}

获取位图:

代码语言:javascript
复制
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;
  }

我需要一个解释,尽管我已经遵循了文档,也许还有一个解释。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-02-04 17:09:42

如果您请求传统存储,则还必须获得存储权限:android:requestLegacyExternalStorage="true"

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

如果你的目标是API30,requestLegacyExternalStorage就不能工作。您需要将目标SDK设置为29或使用媒体存储API。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66042220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档