问题标签 [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 回答
688 浏览

android - Android 10 上作用域存储的行为变化

我开始着手将 SDK 迁移到 29。

我遇到的主要问题Environment.getExternalStorageDirectory()是已弃用和限定存储。

我把它全部替换为Context# getExternalFilesDir(null). 它开始使用 Android 11 beta 开发 Pixel 3a。

但是当我在带有 Android 10 的三星 s9+ 上对其进行测试时。它开始给我这个错误:

我试图在Glide的帮助下加载图像。

我也在其他设备上进行了测试。它不仅适用于 Android 10 设备。它适用于运行 Android 9 及更低版本和 Android 11 Beta 的设备。

然后,我将它放在android:requestLegacyExternalStorage = "true"我的清单中,它也开始在 Android 10 上运行。

现在我的问题是:

  • 如果它与 Scoped 存储有关,那么为什么它可以在 Android 11 而不是 Android 10 上运行?
  • 我们是否只需要 Android 10 的旧标志来完成这项工作?
0 投票
2 回答
1171 浏览

android - listFiles() 在 Android 10(范围存储)中没有用。需要特定目录的文件

我已经实现了范围存储并且需要列出来自第三方应用程序的 JPEG 文件让我们将其命名为测试应用程序,它在以下两个路径中创建“测试”文件夹

  1. 在内部存储 -> /storage/emulated/0/Test/.images
  2. 在 sdcard -> /storage/sdcard1/Android/data/com.app.test/files/Test/.images

在 Android 10 上运行的红米 K20pro 中,无论范围存储如何,都会在 .listFiles 上返回 ArrayList。

但是,在 Android 10 上运行的诺基亚 6.1 如果启用了范围存储,则返回 null 并在启用范围存储时返回 null

请帮我从这两个文件夹中获取文件。

0 投票
1 回答
983 浏览

android - 无法在具有 targetSdk 29 的应用程序中获取 ContentResolver.openInputStream(Uri uri) 并在具有 API 29 的设备上获取 compileSdk 29

我在Android 10 (API 29)设备上运行了两个应用程序。从第一个应用程序(“发件人”)中,我发送了放置在手机文件系统上的文件uri图片:jpg

在第二个应用程序(“接收器”)中,我尝试InputStream从上方打开uri

结果得到这个异常:

如果这两个应用程序在Android 9 (API 28)设备上运行是没有问题的。Android 10 (API 29)关于通过第三方应用程序访问Intent.ACTION_VIEWContentResolver.openInputStream访问uri第三方应用程序有哪些变化!?

“发件人”应用程序有

“接收器”应用程序有

并且android:requestLegacyExternalStorage="true"Manifest.

0 投票
1 回答
128 浏览

android - 使用范围存储保存二进制文件

我有一个应用程序,用户可以在其中选择和生成 bin 文件,这些文件必须易于用户访问。

到目前为止,我一直在要求用户在 SD 卡上创建一个文件夹,并将所有 bin 文件保存在该文件夹中,用户可以手动添加新文件,这些文件将显示在应用程序的文件管理器中。

我不知道如何使用 scooped storage 执行此操作,看起来我无法保存在默认目录中,因为用户不容易访问,最大的问题是删除应用程序时删除了此文件夹。

这是一个很大的禁忌,即使删除了应用程序,也应该保留所有文件,否则,我的用户会很生气,即使删除了应用程序,bin文件对用户也很重要。

0 投票
1 回答
2296 浏览

android - DownloadManager 在 Android 11 模拟器上抛出 IllegalStateException 或 SecurityException

我的目标是 Android 10 / api 29,并且 DownloadManager 在版本 10 或更低版本上运行良好。它也适用于 R 预览版(我认为它是预览版 2)。但是,当我使用新的 api 30(修订版 6)在模拟器中进行测试时,它将无法正常工作。

当在带有 api 30 的模拟器上运行并调用 setDestinationInExternalFilesDir 时,它会在同一行出现异常:

代码是这样的:

如果我改为调用 setDestinationUri,则在使用请求调用 enqueue 时会出现异常:

例外:

异常的行是这样的:

在 api 29 上运行时,setDestinationInExternalFilesDir 和 setDestinationUri 都有效。

编辑:我也尝试过定位 api 30,它也有同样的问题。

此外,如果我在出现异常后再次尝试调用它,则不会引发异常,但是 DownloadManager 将无法下载文件并在查询时返回 DownloadManager.STATUS_PAUSED。

编辑:这是一个完整的例子,它不能在 Android 11 上工作,但在 Android 10 上工作。我没有使用 android:requestLegacyExternalStorage="true",它仍在 Android 10 上工作。他们还在文档中声明,当使用 setDestinationUri它将被保存到应用程序特定的目录。

在抛出异常之前也有这个警告:

0 投票
0 回答
540 浏览

android - 如何实现范围存储以从库中选择视频并将其发送到 Android 10 上的另一个 Activity

在我的应用程序中,我有 2 个按钮,一个用于打开相机并录制视频,另一个用于从图库中选择视频,然后我使用意图将视频发送到另一个活动。它在除 android 10 之外的所有 android 版本上都能正常工作

0 投票
0 回答
312 浏览

android - Android范围存储,备份海量数据

众所周知,从 Android Q (API=29) 开始引入了新的Scoped Storage概念,它基本上阻止了对外部文件/目录的访问,媒体文件除外。即:

  1. 程序员可以使用内部/应用程序特定的存储(无限制) -getFilesDir()
  2. 唯一可以访问的外部存储是 via getExternalFilesDir(),但在应用程序卸载期间数据将被删除
  3. 可以选择通过 访问外部存储MediaStore,但它仅适用于媒体文件
  4. 应用程序仍然可以通过以下方式读取任何外部文件:getContentResolver().openInputStream(uri)

在我的例子中,我有一个应用程序,它将用户数据存储在应用程序特定目录中的 SQLite 数据库中,数据库大小可以达到几个演出。

在我的应用程序的所有以前版本中,用户习惯于将数据备份到外部存储/SD/USB 并将这些数据传输到他们的新设备,以便他们可以继续使用数据(它是包含任何类型私人数据的加密数据库,包括音频/视频/文件等)。

问题:我怎样才能备份这个数据库?我无法找到合适的方法将数据保存/备份到任何外部存储...

由于数据库的大小,PS Android 自动备份服务无法使用。

0 投票
0 回答
85 浏览

android - 使用 MediaStore 存储音频文件在设置 TITLE、ARTIST、COMPOSER 等时失败

我正在使用 Android MediaRecorder 通过使用最新的 MediaStore 音频 API 将新的录音创建为 mp3 文件。使用以下代码设置新文件的属性。

但只有DISPLAY_NAME有效,其余都无效。在此之后,我尝试使用以下代码更新文件,但这也不起作用。只有DISPLAY_NAME更改有效。没有其他的。我认为这不是 Google 的错误,因为大多数媒体播放器应用程序都应该可以正常工作。我在这里想念什么?可能有点傻

0 投票
0 回答
124 浏览

sharing - 在android 10中共享图像,我应该迁移到范围存储

我在 android 10 中共享图像时遇到问题。我收到此错误:

java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.my.app.provider/external_files/Downloads/96732_9f726aea1ca9566cb0ab4846a8e1bcd8.jpg from pid=13435, uid=1000 需要导出提供程序, 或 grantUriPermission()

我应该迁移到范围存储但我不知道如何迁移的问题。我是初学者。这是我的代码:

0 投票
1 回答
520 浏览

android - Android 10 范围存储如何删除共享目录中的底层图像文件

我正在使用文档MediaStore中的范围存储和内容提供程序。

问题是基础文件没有被删除。(我还没有看到关于这个主题的具体问题,但许多评论表明这不是我独有的。)

它实际上变得更糟,因为当我打开 Google Photos 应用程序时,底层文件只消失了一瞬间并被恢复。该基础文件的新条目也在数据库中创建。

我通过使用带有旧_id值的内容提供程序查询并获得空结果来确认这一点。_id此外,使用新字段创建相同图像的新条目。在文件应用程序中,文件就在那里。

这是一个错误还是我错过了什么?我是否需要使用 SAF 删除文件?