问题标签 [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 投票
2 回答
3617 浏览

android - Scoped Storage:如何通过 MediaStore 删除多个音频文件?

我正在尝试从设备的外部存储(例如/storage/emulated/0/Music文件夹中)中删除音频文件。在分析了MediaStore示例之后,我最终得到了 API 28 及更早版本的以下解决方案:

我注意到上面的代码只从 MediaStore 数据库中删除了曲目,但没有从设备中删除(文件在重新启动后重新添加到 MediaStore)。因此,我修改了该代码以查询该Media.DATA列,然后使用该信息删除相关文件。这按预期工作。

但是现在 Android Q 引入了 Scoped Storage,Media.DATA(和Albums.ALBUM_ART)现在已被弃用,因为应用程序可能无法访问这些文件。ContentResolver.openFileDescriptor只能用来读取文件,不能删除。

那么从 Android Q 开始删除曲目的推荐方法是什么?该示例没有显示如何从 中删除多个文件MediaStore,并且MediaStore.Audio.Media似乎与MediaStore.Images.Media.

0 投票
0 回答
76 浏览

android - Android 10 上的不同风格之间的备份和恢复

我有一个相对较旧的游戏,目前使用 Lollipop 目标,我想以最新的 API 级别为目标。

它具有使用外部存储的备份和恢复功能,它将偏好和游戏进度导出到单个路径上的单个文件中,并且不询问用户任何内容。它可以在任一版本中恢复,在付费版本首次安装时,如果在设备上找到备份(从免费版本导出),它甚至会要求用户恢复进度。

有什么方法可以使用 android 10 上的新范围存储来实现此功能?我试图环顾四周,但没有找到任何足够的解决方案,只是提示用户进入一个可能令人困惑的文件夹。目前我只看到通过 Google Play 游戏服务实现保存或提示用户提供文件夹权限的选项,这令人困惑并且需要大量代码。

有没有办法在外部存储上的我的口味(不同的包名称)之间使用单个共享文件夹?如果在卸载应用程序时将其删除,则不是问题。

0 投票
0 回答
1970 浏览

android - MediaStore.MediaColumns.DATA 已弃用并且 contentResolver.openAssetFileDescriptor(uri, "r") 花费大量时间。如何检查 Uri 是否存在?

我曾经File.exsits()检查File路径是否由MediaStore.MediaColumns.DATA存在提供。但现在(从 Android10 开始)MediaStore.MediaColumns.DATA已被弃用。所以我用ContentResolver.openAssetFileDescriptor(uri, "r")它来检查它是否存在。但ContentResolver.openAssetFileDescriptor(uri, "r")花费更多时间。

以下代码片段显示了我现在如何检查它。但我不知道每次scoped external storage都能正确获取的应用程序MediaStore.MediaColumns.DATA和正确的返回值。File.exsits()谁有更好的方法来解决这个问题?谢谢!

0 投票
2 回答
9879 浏览

android - Android Q:从图库中获取图像并进行处理

我知道这似乎是一个非常基本的问题,但它专门针对 Android Q。

我只想从图库中获取图像并将其压缩并发送到服务器。但由于 Android Q 的 Scoped Storage,它比我想象的要难。我将首先解释我对代码所做的事情:

首先,我发出选择图像的意图。

它工作正常,我可以在 onActivityResult 方法中获取图像

好的,现在的问题是如何以文件格式访问此图像,以便进一步处理/压缩它。

以下是我尝试过的事情:

这是我得到的路径:

我通过以下方式从中创建了一个文件:

以下是我压缩和上传图像的自定义逻辑:

在这个自定义逻辑中,我有一个方法来处理图像的采样和旋转,如下所示:

但是当我尝试使用context.contentResolver.openInputStream打开流时 ,出现以下错误:

我知道我得到了这个,因为在 Android 10 中,我们无权直接从外部存储访问文件。

所以,请帮我解决这个问题,如何在 Android 10 中将外部存储中的图像用作文件。

注意:我拥有所有必需的权限,所以这不是问题

0 投票
1 回答
599 浏览

android - Android scoped storage and persistent files

I have an app that creates a directory for backup files on the external storage and automatically creates backup files when the user exits the app. One backup file per week is created and then one backup file that is overwritten all the time with latest info.

  1. The backup files can't be located in getExternalFilesDir since they needs to survive that the user reinstalls the app.
  2. I can't use MediaStorage because it's not an image or video.
  3. I can't use Storage Access Framework to ask the user every time he exits the app to save a backup file.

So how to automatically create persistent backup files with the new Scoped Storage?

(I also need to list all created backup files, if the user wants to restore one of them.)

0 投票
1 回答
392 浏览

android - Android Environment.isExternalStorageLegacy() 总是返回 true

我构建了一个小应用程序,在应用程序的 AndroidManifest.xml 中使用 compileSdkVersion 29、targetSdkVersion 29 编译它我要么指定

或将其完全删除。我从 Android 10 模拟器(Android Studio 附带的最新版模拟器)中卸载了该应用程序。然后安装并检查 Environment.isExternalStorageLegacy(); 它总是返回真。我错过了什么?

0 投票
2 回答
397 浏览

android - Android FileProvider content:// uri 在目标应用程序中没有读取权限

我尝试将我的 App1“external_files”目录(/storage/emulated/0/Android/data/com.package.app1/files)中存在的文件(PDF 类型,但这并不重要)共享给我的 App2。我正在 Android 10 模拟器(来自 Android Studio,最新)中对此进行测试,这两个应用程序都使用 Scoped Storage,并且未启用对旧版外部存储的支持。

一切似乎都是由“书”定义的,在 App1 清单中:

然后 my_paths.xml 有

然后在 App1 中:

App2 在其清单中有:

在 App2:活动 onCreate():

无论我做什么,输出总是:

我在做什么错,为什么我不能得到“可以阅读:真实”?

0 投票
3 回答
3933 浏览

android - Android - 使用 Google Scoped Storage API 访问本机 C/C++ 代码中的文件

我需要在原生 C/C++ 代码中的 Android 应用程序中按文件名打开文件。本机代码是我不想修改的第 3 方库,但它们通常需要文件名作为读取/写入文件的参数。使用 Google 的“范围存储”API 并在 Android 10 或更高版本中禁用对文件的本机访问,这是一个真正的问题。

一个众所周知的解决方案是获取文件描述符并使用“proc/self/fd/FD_NUMER”技巧,例如:

将此传递给本机 C/C++ 代码有效,但前提是文件位于手机主存储中。如果用户试图打开插入电话插槽的外部 SD 卡上的文件,则它不起作用 - 以这种方式打开的文件没有读取权限。我只能获取文件描述符 int 编号并使用 fdopen(fd)。但这将需要修改 3rd 方库(开源或许可)的源代码,并且每当这些库的原始源更新时,这是一个非常令人头疼的问题。

有没有更好的解决这个问题的办法?不,我不想听到添加的解决方案

到 AndroidManifest.xml 应用程序部分 - 谷歌威胁要在 2020 年的下一版本 Android 中禁用它,因此需要一个永久的解决方案。另一个简单但愚蠢的解决方案是将用户尝试打开的整个(可能是巨大的)文件复制到私有应用程序目录中。愚蠢而无用...

0 投票
0 回答
672 浏览

android - 如何拍照并将结果保存到 Andrdoid 10 上的图片中?

谷歌在 Android 10 上引入了 Scoped Storage,根据文档,我们可以使用 MediaStore API 在不请求权限的情况下写入公共目录。

在Android 10之前,当我们需要拍照并保存到Pictures时,代码如下:

我们直接在 Pictures 中创建文件,并将文件 uri 放入 takePhotoIntent extra 中,当我们启动意图并拍照时,原始大小的照片将保存到 Pictures 目录中。

但是现在我们的目标是 android 10,根据文档,请求 WRITE_EXTERNAL_STORAGE 权限将照片保存到图片目录中是不必要的。

没有权限,我们不能创建文件然后获取文件的uri,将其放入intent extra。那么我们如何保存原始尺寸的照片呢?

0 投票
4 回答
8815 浏览

android - 下载管理器不适用于 Android 10 (Q)

很长一段时间以来,我一直在努力解决这个问题......我正在更新一个使用 DownloadManger 执行简单任务的应用程序,例如将文件下载到外部存储公共目录,即:

从 Android api 19-28 开始一切正常。它在 API 29 (Q/10) 上进行测试时会出现问题。Android 实现了范围存储,因此弃用了 getExternalStoragePublicDirectory... 因此,我需要找出一个兼容的解决方案来支持 API 19-29。我不能使用内部应用程序存储,因为 DownloadManager 会抛出 SecurityException。Androids 文档声明我可以使用 DownloadManager.Request setDestinationUri,它甚至提到了我可以使用的 Android Context.getExternalFilesDir(String)Q。但是,当我这样做时,路径仍然是模拟路径:

我从下载管理器收到一个回调,说下载已完成(使用正确的 ID),但是我无法从保存它的区域获取下载。我检查文件是否存在并返回 false:

任何帮助表示赞赏

为上下文添加代码。所以设置下载管理器

检查文件是否存在: