随着较新的 Android Q 的出现,许多事情发生了变化,尤其是在范围存储和逐渐弃用file:///
URI 的情况下。问题是缺乏关于如何在 Android Q 设备上正确处理媒体文件的文档。
我有一个媒体文件(音频)管理应用程序,但我找不到一种可靠的方法来告诉操作系统我对文件执行了更改,以便它可以更新其 MediaStore 记录。
选项 #1:MediaScannerService
MediaScannerConnection.scanFile(context, new String[]{ filePath }, new String[]{"audio/*"}, new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String s, Uri uri) {
}
});
- 使用
file://
来自主存储的 URI - 不适用于
file://
辅助存储(例如可移动存储)中的 URI - 不适用于任何
content://
URI
选项#2:广播
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
- 根本不工作
- 很快被弃用
选项 #3:手动插入 MediaStore
AudioFileContentValues
是来自 的一些列值MediaStore.Audio.AudioColumns
。
基于file://
URI的旧方法:
Uri uri = MediaStore.Audio.Media.getContentUriForPath(file_path);
newUri = context.getContentResolver().insert(uri, AudioFileContentValues);
MediaStore.Audio.Media.getContentUriForPath
已弃用- 还是行不通
基于我可以从文档中汇总的新方法:
Uri collection = MediaStore.Audio.Media.getContentUri(correctVolume);
newUri = context.getContentResolver().insert(collection, AudioFileContentValues);
来自主存储的位置,而类似于辅助存储的位置,取决于文件所在的位置correctVolume
。external
0000-0000
- 插入返回一个内容 URI,例如,
content://media/external/audio/media/125
但没有记录保存在 MediaStore 中,用于位于主存储中的文件 - 插入失败,没有返回 URI 并且 MediaStore 中没有记录
这些或多或少是以前 Android 版本中可用的所有方法,但现在它们都不允许我通知系统我更改了一些音频文件元数据并让 Android 更新 MediaStore 记录。事件虽然选项 #1 部分有效,但这绝不可能是一个有价值的解决方案,因为它显然不支持内容 URI。
尽管文件位于何处,是否有任何可靠的方法可以在 Android Q 上触发媒体扫描?根据 Google 的说法,我们甚至不应该关心文件位置,因为我们很快将只使用内容 URI。在我看来,MediaStore 一直有点令人沮丧,但现在情况更糟了。