问题标签 [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-permissions - 我应该请求读取或写入权限以访问 Android Q 中的 Mediastore 图像吗?
我最近将我的应用更新为 Target API 29 (Android Q)。这是一个照片应用程序,可以拍照并将图像存储在图库中。我获得WRITE_EXTERNAL_STORAGE
了通过“getExternalStoragePublicDirectory”在主外部存储中创建文件夹并从图库中读取图像的权限。因为,上述方法已被弃用,谷歌推荐了三个选项,我选择了 Mediastore。
由于我们不再需要写权限来存储图像,所以我在拍照时不再向用户询问写权限。但是要阅读图像,我们需要许可。根据此表,Google 建议获取WRITE_EXTERNAL_STORAGE
或READ_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
提供更精细的权限控制。
哪个更合适?
android - 如何使用 MediaStore API 插入正确的文件名而不是任意名称的媒体文件到 MediaStore?
我正在尝试支持范围存储并尝试统一处理媒体文件的实现:将媒体文件插入到 mediaStore 已成功完成但具有任意名称,例如:如果文件名是geeks.jpg
它实际上将其创建为 ex599345665432.jpg
android - 将视频保存到 Android 的 MediaStore 时设置文件名和扩展名
我需要一些非常简单的东西 - 我有一个我的应用程序录制的 mp4 文件,我想将它插入 MediaStore 到用户的视频收藏中。这是我的代码,包括处理新范围存储的推荐方法:
但是,在这个函数调用之后,文件名video_1.mp4
变成了类似1589077991588.3gp
的,所以名称和扩展名都不同(我的设备是 Android 9)。MediaStore.MediaColumns.DATA
已弃用。我怎样才能解决这个问题?
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?
android - Android Studio MediaStore,低于 SDK 29 在 sd 卡中保存图像失败
我需要将图像保存在 Android 10 下面的 sd_card 的图片目录中。我已经实现了范围存储&此代码适用于 sdk 29 及更高版本,因为 MediaStore.getExternalVolumeNames 已添加到 sdk 29 中。在 sdk 29 下面如何获取getContentUri
sd_card 。
请帮我解决这个问题
android - 如何使用 b4a 在 android 11(范围存储)中获得“所有文件访问”或“对文件夹的永久和完全访问”?
请提供任何样品
所有应用程序都可以获得“所有文件访问权限”吗?(比如 apk 文件非共享和游戏商店外?)
在获得“所有文件访问”或“访问存储文件夹”之后,我可以使用这样的文件地址吗
或者
和其他文件方法...?
安卓10呢?我应该只android:requestLegacyExternalStorage="true"
在清单中使用它吗?
android - 有没有办法在启用范围存储的 Android 中获得 100% 正确的文件扩展名?
我正在尝试在我的 Android 应用程序中实现文件发送功能(允许任何文件,并且这些文件不属于我的应用程序)。从ACTION_OPEN_DOCUMENT
我收到一个,然后我用我从's获得的名称InputStream
制作一个临时File
对象,然后发送文件。我做这一切的原因是我使用了一个只允许对象的 3rd 方 API。ContentResolver
OpenableColumns.DISPLAY_NAME
File
但是OpenableColumns.DISPLAY_NAME
并不能保证我得到的文件名具有文档中所述的文件扩展名。据我了解,在较新版本的 Android 中,无法使用Scoped Storage获取文件的实际文件名或物理路径。因此,我必须检查文件名是否包含扩展名,如果没有 -使用MimeTypeMapContentResolver
获取文件的 MIME 类型和最常见的扩展名。这种方法感觉不是很可靠,因为我必须同时依赖正确确定 MIME 类型和检索正确的扩展名。获取扩展至关重要,至少因为用户应该能够从桌面应用程序下载和打开 PC 上的文件。ContentResolver
MimeTypeMap
那么,是否有可能在启用范围存储的情况下获得 100% 保证的文件名或至少文件扩展名?或者也许有更有效的方法来处理我的情况?我很感激这方面的一些帮助。
android - 我们应该在 Android 中使用 getPath 还是 getAbsolutePath
在 Android 系统中处理文件时,我们应该使用File
getPath
orgetAbsolutePath
吗?
例如,我们下载了文件,然后我们使用DownloadManager.addCompletedDownload()
将此文件添加到全局downloads
文件夹以便在那里可用,path
我们应该通过哪个?
当我们创建File
内部context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath()
文件夹时的另一个例子,getPath
或者getAbsolutePath
?
最后一个例子,当我们使用MediaScannerConnection.scanFile()
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 也不起作用。