问题标签 [scoped-storage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
285 浏览

android - 范围存储 - 在没有 SAF 的情况下,是否仍然可以通过绝对路径获取图像 Uri?

我知道从 api 29 开始,我们需要使用 URI 和图像 ID 来执行位图操作,但是为了从图像路径迁移到 uri,我需要删除真实用户数据库和服务器数据库,如果有办法避免这种情况我想尝试。例如,我在这里收到“FileNotFoundExeption:没有内容提供者”错误:

谢谢!

编辑:

path 是绝对文件路径,例如 /storage/emulated/0/DCIM/Camera/20200128_122949_020.jpg

在代码片段中,我试图解码图像边界,例如通过图像路径获取文件系统上图像的宽度和高度。

0 投票
1 回答
2714 浏览

android - 为什么在 Android Q 及更高版本上不需要 WRITE_EXTERNAL_STORAGE

我使用 DownloadManager 下载照片并将其保存到外部图片目录:

Marshmallow 需要 WRITE_EXTERNAL_STORAGE (如预期的那样),但在 Android Q 及更高版本上,无需许可即可正常工作。为什么会这样?是因为范围存储吗?

0 投票
1 回答
2021 浏览

android - 安卓 11 | 范围存储实施

根据文档

使用范围存储,除非您的应用需要访问存储在应用特定目录之外以及 MediaStore API 可以访问的目录之外的文件。如果您将特定于应用程序的文件存储在外部存储上,则可以通过将这些文件放置在外部存储上的特定于应用程序的目录中来更轻松地采用范围存储。这样,您的应用程序在启用范围存储时保持对这些文件的访问。

就我而言,我正在使用以下内容创建一个文本文件:

上面是在以下位置创建一个文件(虽然没有可用的 SD 卡):

我正在对它进行写入操作。

以下是查询:

  1. 在参考上述文件时,仍然不清楚 Scoped 存储强制是否适用于上述场景?我是否需要实现 Scoped Storage 或者它会在没有任何更改的情况下工作,并且不会受到 Android 11 行为更改的影响。

  2. 根据我的理解,由于 Android 11,Scoped 存储强制执行没有任何影响。因为我没有应用程序需要访问存储在应用程序特定目录之外的文件的用例。这种理解正确吗?

  3. 如果我想读取位于 Downloads 文件夹下的文件,我需要实现 Scoped Storage,因为我的应用程序想要访问存储在应用程序特定目录之外的文件。这种理解正确吗?
0 投票
1 回答
4553 浏览

java - 在 Android Q 中从外部存储访问照片

我最近将应用程序的目标版本升级到 API 29。由于 Android 10 中的范围存储,我使用 MediaStore API 从应用程序外部存储存储和检索图像。以前,我用来getExternalStoragePublicDirectory存储通过相机拍摄的图像,现在我MediaStore.Images.Media.EXTERNAL_CONTENT_URI用来将文件写入外部存储位置。

我现在面临的问题是,当我打开我的应用程序并拍照时,它存储在我给“myapp”的文件夹名称下,我可以通过 Mediastore 光标检索我的图像并将它们显示在自定义画廊中。当我卸载我的应用程序'myapp'文件夹仍然存在。当我再次安装我的应用程序并尝试从图库中读取图像时,光标没有返回任何图像。但如果我再次拍照,那么我可以将它们加载到我的自定义画廊。自定义图库视图只是屏幕底部的一行图像,因此用户无需浏览照片文件夹即可将图像加载到应用程序。

这就是我将图像存储在 MediaStore 中的方式

内容值:

生成名称方法:

读取图像

为什么当我重新安装我的应用程序时,上述代码没有返回我存储在 Mediastore 文件夹中的图像。是设计使然还是我遗漏了什么?

这些是我正在检索的列,

0 投票
0 回答
54 浏览

android - Android:选择文件时看不到内部存储(随机设备)

从文件资源管理器中选择文档时,我无法在一些设备中看到内部存储。当文件资源管理器打开时,它只显示“最近”、“下载”和“图像”选项卡。问题是这个问题发生在少数设备中。

这是我用来从文件资源管理器中选择文档的代码:

这里,

我在三星 J7 Nxt(Android 9)设备和 OnePlus 7 Pro(Android 10)上进行了尝试,它对我来说运行良好。

我遇到此问题的设备:OnePlus 7 - Android 10

我还检查了其他 OnePlus 7 设备,它运行良好。

可能是什么原因?

在此处输入图像描述

0 投票
0 回答
126 浏览

android - Android Scoped Stoage - 在 onActivityResult 中获取视频详细信息

用例 - 目前我正在开发视频上传模块。为了获取视频,我已经触发了 SAF 视频选择器意图,但即使我已经观看了 Google IO 19 Preparing Scoped Storage Video 但我也无法获得任何方式或代码来从 OnActivityResult 中的 uri 获取视频详细信息,但也没有提供任何示例代码如何要做到这一点。(视频细节意味着持续时间大小名称分辨率和名称)

要获取视频详细信息,我们必须使用推荐的 MediaStore api,如果我传递文件 uri,MediaStore 仅适用于内容 URI,则光标将始终为空,并且我们仅在光标不为空时获取内容 uri

希望有人能帮助我

我正在使用此代码打开视频选择器

在 onActivityResult 中通过传递来自意图的 uri 调用了这个函数-

已通过互联网搜索解决方案,但没有找到任何解决方案,因此在此处发布。我的测试设备是荣耀 8x(Android 10 版本)

0 投票
1 回答
623 浏览

android - 来自范围存储的 Android 10 文件信息(从 Uri 获取文件扩展名)

问题

我正在使用此代码从设备中选择单个文件(主要是下载文件夹)。

它运作良好,我得到了 Uri,并且我能够通过读取文件contentResolver.openInputStream(uri)

当我实际上需要知道这是什么类型的文件时,就会出现问题。换句话说,我需要知道它的扩展名。

为此,我可以轻松使用:

但问题是:如果文件的格式至少application/octet-streamtype.

示例:SHP又名 Esri Shape 文件。

在诺基亚 8 Android Pie(28 api 级别)中的其他观察

我得到的实际uri是: content://com.android.providers.downloads.documents/document/1470

在相同类型文件(Shp)的 Android 10 模拟器中,我得到: content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FRO20.shp

我可以用它自己来获得最后一部分“.shp”

实际问题 所以主要我有两个问题:

  1. 有没有办法从 Uri 获得确切的文件扩展名(没有来回的 mime 类型转换)?
  2. 我有多可靠地声明从 29 api 级别开始我可以从 uri 它自己解析文件扩展名而不会失败?
0 投票
0 回答
1432 浏览

android - Android Q,使用 MediaStore ContentResolver 获取文件列表

根据https://developer.android.com/training/data-storage/shared/documents-files#use-cases,一旦 I targetSdk 29,从 /Downloads 目录获取文件列表的唯一方法是使用ACTION_OPEN_DOCUMENT_TREE,特别是:

这很好,但它需要一些明确的用户操作来选择和批准它。(虽然如果 targetSdk 30/R ..这将进一步被杀死,但现在这不是重点)

那么https://play.google.com/store/apps/details?id=com.google.android.apps.nbu.files如何在没有明确选择/批准的情况下仍能从 /Downloads 获取文件列表?(它也是targetSdk 29

我尝试了这些方法,它们返回空结果"uri empty"

*(请注意,这是在 Emulator Android Q 上,我没有物理 Q 设备)

是的,READ_EXTERNAL_STORAGE并且WRITE_EXTERNAL_STORAGE被授予,并且也尝试过android:requestLegacyExternalStorage="true"

正如预期的那样,执行此操作的旧方法也不起作用:

(当然,当我切换回 时targetSdk 28,上述所有操作都会再次起作用。)

我是否缺少其他一些 API/方法?谢谢!

编辑:添加query代码

0 投票
3 回答
7410 浏览

android - 如何将pdf保存在范围存储中?

在引入范围存储之前,我使用下载管理器在我的应用程序中下载 pdf 并从中获取 pdf getExternalStorageDirectory,但由于范围存储,我不能再使用getExternalStorageDirectory它,因为它已被弃用。我决定离开下载管理器,它在公共目录中下载文件,而是使用改造来下载 pdf 文件。我知道我可以requiredLegacyStorage在 Android Manifest 中使用该标签,但它不适用于 Android 11,所以我没有使用它。

这是我的代码

虽然下载了 pdf id,但该文件从未使用我编写的 InputStream 辅助函数存储。我需要将该 pdf 添加到我的应用程序的内部存储中,并使用 PDFRenderer 渲染它。

0 投票
0 回答
1173 浏览

android - 如何使添加到 android Q 中的 RELATIVE_PATH 向后兼容?

根据文档,在 API 级别 29 中添加的 RELATIVE_PATH public static final String RELATIVE_PATH 此媒体项目在存储设备中的相对路径,它被持久化。例如,存储在 /storage/0000-0000/DCIM/Vacation/IMG1024.JPG 的项目将具有 DCIM/Vacation/ 路径。

如何在 Android Q Afaik 之前组织我在 Android 上插入到 MediaStore 的媒体文件:根据已删除的文档PRIMARY_DIRECTORY不起作用 put(MediaStore.MediaColumns.PRIMARY_DIRECTORY, relativePath)