问题标签 [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.
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 的旧标志来完成这项工作?
android - listFiles() 在 Android 10(范围存储)中没有用。需要特定目录的文件
我已经实现了范围存储并且需要列出来自第三方应用程序的 JPEG 文件让我们将其命名为测试应用程序,它在以下两个路径中创建“测试”文件夹
- 在内部存储 -> /storage/emulated/0/Test/.images
- 在 sdcard -> /storage/sdcard1/Android/data/com.app.test/files/Test/.images
在 Android 10 上运行的红米 K20pro 中,无论范围存储如何,都会在 .listFiles 上返回 ArrayList。
但是,在 Android 10 上运行的诺基亚 6.1 如果启用了范围存储,则返回 null 并在启用范围存储时返回 null
请帮我从这两个文件夹中获取文件。
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_VIEW
和ContentResolver.openInputStream
访问uri
第三方应用程序有哪些变化!?
“发件人”应用程序有
“接收器”应用程序有
并且android:requestLegacyExternalStorage="true"
在Manifest
.
android - 使用范围存储保存二进制文件
我有一个应用程序,用户可以在其中选择和生成 bin 文件,这些文件必须易于用户访问。
到目前为止,我一直在要求用户在 SD 卡上创建一个文件夹,并将所有 bin 文件保存在该文件夹中,用户可以手动添加新文件,这些文件将显示在应用程序的文件管理器中。
我不知道如何使用 scooped storage 执行此操作,看起来我无法保存在默认目录中,因为用户不容易访问,最大的问题是删除应用程序时删除了此文件夹。
这是一个很大的禁忌,即使删除了应用程序,也应该保留所有文件,否则,我的用户会很生气,即使删除了应用程序,bin文件对用户也很重要。
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它将被保存到应用程序特定的目录。
在抛出异常之前也有这个警告:
android - 如何实现范围存储以从库中选择视频并将其发送到 Android 10 上的另一个 Activity
在我的应用程序中,我有 2 个按钮,一个用于打开相机并录制视频,另一个用于从图库中选择视频,然后我使用意图将视频发送到另一个活动。它在除 android 10 之外的所有 android 版本上都能正常工作
android - Android范围存储,备份海量数据
众所周知,从 Android Q (API=29) 开始引入了新的Scoped Storage概念,它基本上阻止了对外部文件/目录的访问,媒体文件除外。即:
- 程序员可以使用内部/应用程序特定的存储(无限制) -
getFilesDir()
- 唯一可以访问的外部存储是 via
getExternalFilesDir()
,但在应用程序卸载期间数据将被删除 - 可以选择通过 访问外部存储
MediaStore
,但它仅适用于媒体文件 - 应用程序仍然可以通过以下方式读取任何外部文件:
getContentResolver().openInputStream(uri)
在我的例子中,我有一个应用程序,它将用户数据存储在应用程序特定目录中的 SQLite 数据库中,数据库大小可以达到几个演出。
在我的应用程序的所有以前版本中,用户习惯于将数据备份到外部存储/SD/USB 并将这些数据传输到他们的新设备,以便他们可以继续使用数据(它是包含任何类型私人数据的加密数据库,包括音频/视频/文件等)。
问题:我怎样才能备份这个数据库?我无法找到合适的方法将数据保存/备份到任何外部存储...
由于数据库的大小,PS Android 自动备份服务无法使用。
android - 使用 MediaStore 存储音频文件在设置 TITLE、ARTIST、COMPOSER 等时失败
我正在使用 Android MediaRecorder 通过使用最新的 MediaStore 音频 API 将新的录音创建为 mp3 文件。使用以下代码设置新文件的属性。
但只有DISPLAY_NAME有效,其余都无效。在此之后,我尝试使用以下代码更新文件,但这也不起作用。只有DISPLAY_NAME更改有效。没有其他的。我认为这不是 Google 的错误,因为大多数媒体播放器应用程序都应该可以正常工作。我在这里想念什么?可能有点傻
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()
我应该迁移到范围存储但我不知道如何迁移的问题。我是初学者。这是我的代码:
android - Android 10 范围存储如何删除共享目录中的底层图像文件
我正在使用文档MediaStore
中的范围存储和内容提供程序。
问题是基础文件没有被删除。(我还没有看到关于这个主题的具体问题,但许多评论表明这不是我独有的。)
它实际上变得更糟,因为当我打开 Google Photos 应用程序时,底层文件只消失了一瞬间并被恢复。该基础文件的新条目也在数据库中创建。
我通过使用带有旧_id
值的内容提供程序查询并获得空结果来确认这一点。_id
此外,使用新字段创建相同图像的新条目。在文件应用程序中,文件就在那里。
这是一个错误还是我错过了什么?我是否需要使用 SAF 删除文件?