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

android-permissions - 我应该请求读取或写入权限以访问 Android Q 中的 Mediastore 图像吗?

我最近将我的应用更新为 Target API 29 (Android Q)。这是一个照片应用程序,可以拍照并将图像存储在图库中。我获得WRITE_EXTERNAL_STORAGE了通过“getExternalStoragePublicDirectory”在主外部存储中创建文件夹并从图库中读取图像的权限。因为,上述方法已被弃用,谷歌推荐了三个选项,我选择了 Mediastore。

参考:https://developer.android.com/reference/android/os/Environment#getExternalStoragePublicDirectory(java.lang.String)

由于我们不再需要写权限来存储图像,所以我在拍照时不再向用户询问写权限。但是要阅读图像,我们需要许可。根据此表,Google 建议获取WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE

参考:https ://developer.android.com/training/data-storage

它还说“让其他应用程序访问您的文件,尽管其他应用程序需要 READ_EXTERNAL_STORAGE 权限”

Android 文档中的此建议, https://developer.android.com/training/data-storage/shared/documents-files

“但是,如果您的应用使用媒体商店,则您必须请求 READ_EXTERNAL_STORAGE 权限才能访问其他应用的媒体文件。”</p>

我用我现有的WRITE_EXTERNAL_STORAGE许可进行了测试,我能够从图库中读取图像。但是从上面的建议中,我觉得我应该去更好地READ_EXTERNAL_STORAGE提供更精细的权限控制。

哪个更合适?

0 投票
0 回答
89 浏览

android - 如何使用 MediaStore API 插入正确的文件名而不是任意名称的媒体文件到 MediaStore?

我正在尝试支持范围存储并尝试统一处理媒体文件的实现:将媒体文件插入到 mediaStore 已成功完成但具有任意名称,例如:如果文件名是geeks.jpg它实际上将其创建为 ex599345665432.jpg

0 投票
1 回答
565 浏览

android - 将视频保存到 Android 的 MediaStore 时设置文件名和扩展名

我需要一些非常简单的东西 - 我有一个我的应用程序录制的 mp4 文件,我想将它插入 MediaStore 到用户的视频收藏中。这是我的代码,包括处理新范围存储的推荐方法:

但是,在这个函数调用之后,文件名video_1.mp4变成了类似1589077991588.3gp的,所以名称和扩展名都不同(我的设备是 Android 9)。MediaStore.MediaColumns.DATA已弃用。我怎样才能解决这个问题?

0 投票
0 回答
997 浏览

android - 查询公共下载文件夹时 MediaStore 不返回结果(Android Q)

我正在尝试使用 Xamarin 将(apk)文件下载到面向 Android Q(API 29)的 Android 项目中 sdcard 根目录上的“下载”文件夹。

首先,我将文件下载到位于 sdcard/Android/data/com.my.app/files 的应用程序的私有存储空间

然后我使用 MediaStore API 将文件复制到公共“下载”文件夹。这是我的代码:

MediaStore 中的插入第一次有效,但是当我第二次尝试插入时,返回的 Uri 为空。因此,我添加了 ContentResolver 查询,以便检测现有记录,但此查询不返回任何结果。只有当我使用不同的文件名时,它才会再次起作用。

当我查看设备日志时,我可以看到以下错误:

时间设备名称类型 PID 标签消息 05-14 14:14:27.442 错误 14571 SQLiteDatabase android.database.sqlite.SQLiteConstraintException: UNIQUE 约束失败:files._data (code 2067 SQLITE_CONSTRAINT_UNIQUE) at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native方法)在 android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:879) 在 android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:790) 在 android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java :88) 在 android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1599) 在 android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1468) 在 com.android.providers.media.MediaProvider。insertFile(MediaProvider.java:2776) 在 com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:3317) 在 com.android.providers.media.MediaProvider.insert(MediaProvider.java:2966) 在 android.content .ContentProvider$Transport.insert(ContentProvider.java:309) 位于 android.os.Binder 的 android.os.Binder.execTransactInternal(Binder.java:1021) 的 android.content.ContentProviderNative.onTransact(ContentProviderNative.java:154)。 execTransact(Binder.java:994) 05-14 14:14:27.442 错误 14571 SQLiteDatabase 错误插入 bucket_display_name=Download owner_package_name=com.my.app parent=8 volume_name=external_primary date_modified=1589458467 _display_name=XXX.apk mime_type=application/vnd .android.package-archive _data=/storage/emulated/0/Download/XXX.apk title=XXX.apk group_id=102105 is_download=true date_added=1589458467 primary_directory=下载bucket_id=540528482 media_type=0 relative_path=下载/

即使在没有任何过滤器的情况下执行 mediastore 查询,结果计数也是 0。如何获得正确的 Uri?

0 投票
0 回答
817 浏览

android - Android Studio MediaStore,低于 SDK 29 在 sd 卡中保存图像失败

我需要将图像保存在 Android 10 下面的 sd_card 的图片目录中。我已经实现了范围存储&此代码适用于 sdk 29 及更高版本,因为 MediaStore.getExternalVolumeNames 已添加到 sdk 29 中。在 sdk 29 下面如何获取getContentUrisd_card 。

请帮我解决这个问题

0 投票
1 回答
218 浏览

android - 如何使用 b4a 在 android 11(范围存储)中获得“所有文件访问”或“对文件夹的永久和完全访问”?

请提供任何样品

所有应用程序都可以获得“所有文件访问权限”吗?(比如 apk 文件非共享和游戏商店外?)

在获得“所有文件访问”或“访问存储文件夹”之后,我可以使用这样的文件地址吗

或者

和其他文件方法...?

安卓10呢?我应该只android:requestLegacyExternalStorage="true" 在清单中使用它吗?

0 投票
1 回答
354 浏览

android - 有没有办法在启用范围存储的 Android 中获得 100% 正确的文件扩展名?

我正在尝试在我的 Android 应用程序中实现文件发送功能(允许任何文件,并且这些文件不属于我的应用程序)。从ACTION_OPEN_DOCUMENT我收到一个,然后我用我从's获得的名称InputStream制作一个临时File对象,然后发送文件。我做这一切的原因是我使用了一个只允许对象的 3rd 方 API。ContentResolverOpenableColumns.DISPLAY_NAMEFile

但是OpenableColumns.DISPLAY_NAME并不能保证我得到的文件名具有文档中所述的文件扩展。据我了解,在较新版本的 Android 中,无法使用Scoped Storage获取文件的实际文件名或物理路径。因此,我必须检查文件名是否包含扩展名,如果没有 -使用MimeTypeMapContentResolver获取文件的 MIME 类型和最常见的扩展名。这种方法感觉不是很可靠,因为我必须同时依赖正确确定 MIME 类型和检索正确的扩展名。获取扩展至关重要,至少因为用户应该能够从桌面应用程序下载和打开 PC 上的文件。ContentResolverMimeTypeMap

那么,是否有可能在启用范围存储的情况下获得 100% 保证的文件名或至少文件扩展名?或者也许有更有效的方法来处理我的情况?我很感激这方面的一些帮助。

0 投票
2 回答
407 浏览

android - 我们应该在 Android 中使用 getPath 还是 getAbsolutePath

在 Android 系统中处理文件时,我们应该使用File getPathorgetAbsolutePath吗?

例如,我们下载了文件,然后我们使用DownloadManager.addCompletedDownload()将此文件添加到全局downloads文件夹以便在那里可用,path我们应该通过哪个?

当我们创建File内部context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath()文件夹时的另一个例子,getPath或者getAbsolutePath

最后一个例子,当我们使用MediaScannerConnection.scanFile()

0 投票
1 回答
1086 浏览

android - 如何在 Android Q 中选择特定的视频文件上传到图库?

使用 mediaRecorder 和 Camera API 录制视频后,我正在尝试将视频保存到用户的画廊(通过保存到他们的外部电影、DCIM 目录或其他)。

不幸的是,我从文档或 StackOverflow 中找到的代码似乎创建了它们各自的 URI,而没有引用录制的视频或保存它的文件。具体来说,我尝试使用的代码是:

它周围的代码和答案似乎暗示通过访问 MediaStore.VOLUME_EXTERNAL_PRIMARY 解析器可以访问保存的视频文件,但我没有看到对它的明确引用。在录制视频之前,我将分配给 mediaRecorder 的文件定义为:

停止视频后,我收到此错误(引用此行:)Uri uriSavedVideo = resolver.insert(collection, valuesvideos);

java.lang.UnsupportedOperationException: 未知 URI: content://media/external_primary/video/media at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java.167) ...

如何正确创建 URI 并参考保存的视频?用文件中的 URIUri.fromFile(f);代替 uriSavedVideo 也不起作用。

0 投票
0 回答
156 浏览

android - 是否可以在不同的提供者之间移动 (DocumentsContract.moveDocument(...)) 或复制 (DocumentsContract.copyDocument(...)) 文件/文档?