问题标签 [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 及更高版本中使用 MediaStore 保存图像后获取图像信息
在我的应用程序中,我使用以下代码允许用户选择多个图像。
在onActivityResult()
中,我得到了转换为文件列表的 URI 列表。我正在压缩这些文件并使用下面的代码保存位图。
压缩完成后,我会向用户显示压缩图像列表及其压缩前后的大小。
问题是因为我得到了一个File
低于 Android Q 的版本,我可以轻松地提取压缩图像的名称和大小等信息。但是,在 Android Q 及更高版本中,我无法访问文件,因为位图是使用 MediaStore 保存的。是否有任何简单快捷的方法可以使用 MediaStore 获取保存的位图的名称和大小?
android - 从后台任务中删除 Android API v29 中的照片
我正在尝试删除后台任务中的照片。这在 Android API v29 之前很容易做到:
但从 Android API v29 开始,这将抛出一个RecoverableSecurityException
. 这是由于 Android Q 的 Scoped Storage 要求。本文档说明了如何处理RecoverableSecurityException
. 这是我对它的改编:
本文档中的上述代码自行调用startIntentSenderForResult
,没有任何活动。我没有运气让这个工作。请记住,这是在后台任务中,所以我没有对活动的引用。我能够在此后台任务中创建一个新活动,启动该活动,然后调用startIntentSenderForResult
,但这里的问题是该活动仅在应用程序打开时启动,这不符合我的要求。从 Android API v29 开始,活动的启动时间有了严格的规定。
这些将引导我找到解决方案:
- 有没有办法在不打开应用程序的情况下在后台任务中启动活动?
- 有没有办法
startIntentSenderForResult
从我的后台任务中调用?
谢谢!
android - 如何使用android 10及更高版本中的Scoped Storage从保存在外部存储中的文件名获取URI?
在 SDK 29 之前,这是找到 Uri 的正确方法,但现在它不再适用于大于 28的 sdk。假设我使用 scoped-storage 保存 BITMAP,例如:
此代码适用于 SDK <= 28。但是,如何使用保存在 SDK 版本 29 及更高版本的外部存储中的文件名获取 URI?
java - 如何使用 JAVA 在 Android 10 及更高版本的媒体商店中保存 pdf 文件?
更新:
为了保存 PDF 文件:
在下面的答案部分。
为了保存位图文件:
android - Android:范围存储:getContentResolver().update(...):COLUMN_LAST_MODIFIED:UnsupportedOperationException:不支持更新
我正在尝试更新文档/文件的最后修改日期,但我收到“UnsupportedOperationException:不支持更新”
重现步骤:
- 选择文档树
- 在 Activity Result 在所选目录中创建一个新文档:
- 尝试更新文档/文件的最后修改日期
也尝试插入,但结果始终相同:
有没有人遇到过同样的问题,各自找到了解决这个问题的方法?
android - 无法在 android 10 及更高版本的设备上列出所有 pdf 文件
由于存储框架的变化,我无法列出设备上的所有 pdf 文件。这是我的代码:
有没有其他方法可以获取设备上的所有 pdf 文件?必须有一些解决方法(除了 requestLegacyExternalStorage),因为许多应用程序依赖于处理位于其范围存储之外的文件(图像、音频)。
android - getExternalFilesDir(null) 在 Espresso 测试中返回 null
我试图getExternalFilesDir(null)
在执行@BeforeClass
方法期间从 Espresso 测试访问以在开始测试之前设置一些应用程序文件。
我正在尝试像这样访问它:
InstrumentationRegistry.getInstrumentation().context.getExternalFilesDir(null)
Environment.getExternalStorageState()
"mounted"
return ,但在上面的调用中返回getExternalFilesDir(null)
null ,这与文档中声明它仅在未安装存储时才返回 null 相反。
有趣的是,InstrumentationRegistry.getInstrumentation().context.filesDir
它确实返回了一个值,但它返回了一个不存在的文件夹,该文件夹位于测试包而不是应用程序的实际包下。
设置 Espresso 测试时,如何访问和写入应用的范围存储?
java - 范围存储 android 10.0
崩溃在这里......
android.database.sqlite.SQLiteException:靠近“GROUP”:语法错误(Sqlite 代码 1 SQLITE_ERROR):,编译时:SELECT _id,bucket_display_name,bucket_id,_id,来自图像的方向 WHERE((is_pending=0)AND(is_trashed=0 ) AND (volume_name IN ( 'external_primary' ))) AND ((1) GROUP BY 1,(2)) ORDER BY date_modified DESC, (OS error - 2:No such file or directory) at android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:184) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140) 在 android.content.ContentProviderProxy.query(ContentProviderNative.java:423) 在 android.content.ContentResolver.query(ContentResolver.java: 955) 在 android.content.ContentResolver.query(ContentResolver.java:891) 在 android.content.ContentResolver.query(ContentResolver.java:840)
以下是显示所有文件夹或图像相册的方法。
下面是崩溃线......
android - 在下载文件夹的应用程序特定目录中重新安装时保留文件
我们有一个应用程序,允许用户下载文件并将其存储在本地。为了提供对文件的更大访问权限(例如,手动备份),文件被下载到下载目录中的应用程序特定文件夹中。
直到 Android Q,应用程序可以简单地使用 File API 来检查文件是否在本地存在并相应地更新 UI。但是,从那时起,我们已经转向使用 Mediastore API。但是,用户面临的问题之一是重新安装后无法访问下载的文件。重新安装后,该应用程序无法知道以前的安装是否有剩余文件。它永远无法正确管理文件夹。
范围存储文档说,SAF 是让应用程序完全访问文件夹读取和写入权限的方法。还有其他方法吗?如果我们要使用 SAF,我们需要如何在用户每次打开应用时请求权限?有没有办法持久化file
返回的模式 URI?这个用例的文档很少(或者我们没有找到)。
谢谢。
android - 写入权限不起作用 - 范围存储 Android SDK 30(又名 Android 11)
还有其他人发现范围存储几乎不可能工作吗?哈哈。
我一直在尝试了解如何允许用户授予我的应用程序对应用程序文件夹之外的文本文件的写入权限。(假设允许用户在其 Documents 文件夹中编辑文件的文本)。我已经MANAGE_EXTERNAL_STORAGE
设置了所有权限,并且可以确认该应用程序具有权限。但还是每次我尝试
我得到了Illegal Argument: Media is read-only
错误。
我的清单请求这三个权限:
我也尝试过使用旧版存储:
但仍然遇到这个只读问题。
我错过了什么?
额外说明
我如何获取 URI:
接着