Android 10 MediaStore 文件权限

2023-12-15

我仅在 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,我也会得到相同的结果。
通过意图插入文件:

    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;
  }

尽管遵循了文档,但我仍然需要对此进行解释,也许还需要一个解释。感谢。


如果您请求旧存储,您还必须获得存储权限:android:requestLegacyExternalStorage="true"
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />.

如果您的目标是 API 30requestLegacyExternalStorage不起作用。您需要将目标 SDK 设置为 29 或使用媒体存储 API。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 10 MediaStore 文件权限 的相关文章

  • 如何获取每个StorageVolume的可用大小和总大小?

    背景 谷歌 悲伤 计划破坏存储权限 https www xda developers com android q storage access framework scoped storage 这样应用程序将无法使用标准文件 API 和文件
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 如何在我现有的 Android 应用程序中使用 Telegram API(包括聊天应用程序)?

    我想使用 telegram API 在我现有的 Android 应用程序中开发聊天功能 我不知道如何实施 我认为 看看Telegram 数据库库 测试版 从这里TDLib https core telegram org tdlib 俄语 但
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • Android 手机作为 GSM 调制解调器在 PC 上发送/接收短信?

    是否可以将 Android 移动设备用作 PC 上的 GSM 调制解调器 我正在 net下开发应用程序来发送 接收短信等 现在我想通过 USB 将我的 Android 设备连接到我的 PC 并将其用作 GSM 调制解调器来与其通信 这里是参
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • Android - 以编程方式选择菜单选项

    有没有办法以编程方式选择菜单选项 基本上 我希望视图中的按钮能够执行与按特定菜单选项相同的操作 我正在考虑尝试调用 onOptionsItemSelected MenuItem item 但我不知道要为菜单项添加什么 是的 有一种方法可以选
  • 没有用于警告的设置器/字段 Firebase 数据库检索数据填充列表视图

    我只是想将 Firebase 数据库中的数据填充到我的列表视图中 日志显示正在检索数据 但适配器不会将值设置为列表中单个列表项中的文本 它只说 没有二传手 场地插入值 这让我觉得我的设置器没有正确制作 但 Android Studio 自动
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这

随机推荐

  • FastAPI 重定向给出方法不允许错误

    我创建了一个登录路径 在其中发布表单数据并设置 cookie 设置cookie后 我重定向到 main 在那里我得到 detail Method Not Allowed 作为回应 app post login async def login
  • ViewChild - 无法在 Angular 2 RC 1 JavaScript 中工作

    ViewChild 无法在 Angular 2 RC 1 JavaScript 中工作 我用过
  • RibbonApplicationMenu:摆脱 AuxiliaryPane

    碰巧我正在开发的应用程序不对文档进行操作 因此不需要在应用程序菜单中显示最近打开的文档列表 但是 令人烦恼的是 没有现成的房产RibbonApplicationMenu隐藏未使用的类AuxiliaryPane 奇怪的是 该属性确实存在 但被
  • 单击关闭按钮时隐藏表单而不是关闭

    When a user clicks the X button on a form how can I hide it instead of closing it 我努力了this hide in FormClosing但它仍然关闭表单 L
  • Outlook 2013“运行脚本”规则已消失

    我在 Outlook 2013 中有一些工作规则 然而 在我的笔记本电脑前几天崩溃后 我无法再运行任何规则 它们根本不起作用 我什至没有收到调试通知 检查我的宏后 我发现当我尝试单击我拥有的任何脚本时 我不断收到消息 此操作在当前模式下不可
  • iOS XMPP 框架与 Openfire Server 获取所有注册用户

    for my IOS我正在使用的聊天应用程序Openfire服务器 我正在检索特定用户好友列表 但现在我想检索所有注册用户Openfire服务器 请帮助我并提前致谢 最后 我通过使用用户名搜索用户找到了替代答案 1 对于每个联系人 我都会添
  • 如何在高分辨率设备上使用媒体查询

    我制作了一个简单的响应式网站 或多或少 我使用过媒体查询 media only screen and max width 699 99px 现在我知道当分辨率小于 699 99px 时 这会激活其中的 css 所以在电脑上没问题 但在手机上
  • 散景,套索选择表更新

    我希望每个人都做得很好 我正在尝试开发 Bokeh 交互 选择散点图的一部分将更新表格 我使用了 Bokeh 文档中的大量示例代码 我的工作场所正在运行旧版本的 Bokeh 0 12 5 因此我必须更改自定义 JS 中的最后一行 从 s2
  • Pandas:使用 Append 添加新列并使另一个全为 NaN

    我大约一周前才开始学习 pandas 现在我一直在努力处理 pandas 数据框 我的数据如下所示 State NY CA Other Total Year 2003 450 50 25 525 2004 300 75 5 380 2005
  • 在 Pandas 中合并两行(一行有值,另一行 NaN)

    我知道以前也有人问过类似的问题 如何合并数据框中的两行pandas等 但我仍然在努力执行以下操作 除了包含许多行的 pandas 数据框 team token day1 day2 day3 day4 0 abc 1 NaN NaN NaN
  • 如何获取客户端 IP 地址的时区偏移量

    我想为我的网络应用程序获取客户 IP 地址的时区偏移量 我尝试过使用 Javascripts getTimezone 函数 但是 某些客户端的时区或时间设置不正确 我想获取偏移量并根据客户端的时区将一些信息返回给客户端 感谢您花时间阅读问题
  • send() 在 Ruby 中做什么?

    有人可以告诉我下面的片段是什么吗 obj send method name 是并且确实吗 send向类层次结构中的对象实例及其祖先发送消息 直到某个方法做出反应 因为它的名称与第一个参数匹配 实际上 这些行是等效的 1 send 2 1 2
  • 如何测试依赖于argparse的Python类?

    下面的粘贴包含来自三个单独的 Python 文件的相关片段 第一个是从命令行调用的脚本 它在给定某些参数的情况下实例化 CIPuller 发生的情况是脚本被调用 类似于 script py ci 其他参数将被 argparse 吞掉 第二个
  • 访问jar内的图像

    第一的 我知道已经存在各种关于如何访问 jar 文件内的图像的主题 第二 我尝试了很多选择 但没有一个不起作用 我当然知道我在某个地方犯了错误 你能帮助我理解我做错了什么吗 所以 我有一个名为 j 的原型项目 它只包含一个 java 类 C
  • 使用 Jackson 序列化时有条件地跳过对象

    我有一个像这样的课程 interface IHideable boolean isHidden class Address implements IHideable private String city private String st
  • Android Activity 在 4.3 设备上运行缓慢

    我开发了一个可以从网络传输视频的应用程序 我有一个活动列出了视频 包括它们的图标 标题和状态 新更新 每行都有一个视频缩略图 视频标题 然后有一个 新鲜 图标来指示它是新上传的 在模拟器中 这工作得相当好 在 2 3 和 4 0 3 HTC
  • 使用 Python 与其他程序交互

    我有一个想法 使用 Python 编写一个程序 该程序将找到我提供的歌曲的歌词 我认为整个过程应该归结为以下几件事 这些是我希望程序在运行时执行的操作 提示我输入歌曲名称 复制那个名字 打开网络浏览器 例如谷歌浏览器 将该名称粘贴到地址栏中
  • 是否还可以自定义STL向量的“参考”类型?

    是否可以定制reference of a std vector 直到 C 11 似乎可以通过Allocator模板参数 但现在不再了吗 根据文档 http en cppreference com w cpp container vector
  • 如何确定 gfortran 正在矢量化什么

    我正在尝试编写一个大规模并行蒙特卡罗代码 其中一部分将导出到 Xeon phi 协处理器 为了确保我有效地使用协处理器 我想看看编译器 当前为 gfortran 能够对代码的哪些部分进行矢量化 我知道我可以使用 ifort commane
  • Android 10 MediaStore 文件权限

    我仅在 Android 10 中遇到图像权限问题 我声明该问题仅适用于 Android 10 事实上 Android 11 和 Android 9 及更早版本都启用了写入和读取权限 在清单中我有