当前位置: 首页 > 知识库问答 >
问题:

如何仅使用其内容Uri对文件强制进行纵隔存储更新

莘翰采
2023-03-14

在Android Q中,字段mediastore.files.fileColumns.data已被弃用,并且可能为空,或者应用程序在针对这样的操作系统版本时没有读取该字段的权限,因此最好只使用文件的内容URI。

由于MediaScannerConnection只接受文件路径,我发现对于Android Q来说,这不再是一个选项。

在不知道文件的真实路径和仅使用其URI的情况下,强制对单个文件进行自动纵隔更新/重新扫描的方法是什么?其意图是甚至不试图找到真正的路径,而只依赖于URI。

考虑强制更新的Uri是媒体内容Uri(不是SAF Uri)。
示例:content://media/external/images/media/123

解决方案绝不能是重新扫描整个存储或重新卸载/挂载存储,因为这将对我们的工作流产生高性能打击,并将使其完全无法使用。

而且因为意图是只使用Uri,所以避免强制扫描任何特定的文件目录,如果它包含大量文件,这也会产生影响,并且意味着必须从Uri解析真正的目录路径,这不是一个选项。

更新:

我们尝试了Android O中引入的ContentResolver.refresh方法,但结果不成功,但是当涉及到格式为:content://media/external/images/media/123的媒体内容Uri时,该方法根本不进行任何刷新

final ContentResolver resolver = context.getContentResolver();
resolver.refresh(uri, null, null);

共有1个答案

戚令秋
2023-03-14

我目前还在尝试重新设计我的应用程序,使其只使用uri,而不是使用所有的hacky解决方案将其转换为文件路径(比如根据uri权限猜测路径等)。以前,我使用MediasCannerConnection.ScanFile(...),它没有任何缺陷,但您可能已经尝试过了,这对uri不起作用。

我用我的新数据手动更新纵隔URI的方法是成功的,如下所示:

public void updateMediaStore(final Uri content, final String title) {
    final ContentValues values = new ContentValues();
    values.put(MediaStore.Audio.AudioColumns.TITLE, title);
    // ... the rest of your data
    cr.update(res, values, null, null);
}

不过,没有提供重新扫描特定文件的方法似乎是一个疏忽。例如,如果这个URI来自其他地方,例如通过SAF在sdcard上,那么在更新它之前,您必须首先在纵隔中搜索它。

 类似资料:
  • 我正在尝试为我的应用程序列出内部存储和外部存储中的所有歌曲作为列表视图。我正在使用下面的代码来获取歌曲 以上代码正在成功地获取外部存储器中的所有歌曲,但未获取内部存储器中存储的歌曲。这在像三星Galaxy S8这样没有外置存储的设备中是一个问题。我还尝试了使用以下uri的光标 这为我获取设备铃声和短信音调,这不是我需要的。 我在StackOverflow中也遇到过类似的问题,但那里的答案并没有为我

  • 我正在尝试强制缓存这类文件:css、woff、otf、js、jpg、jpeg、gif、png、ico、cur、gz、svg、svgz、mp3、mp4、ogg、ogv和没有扩展名的文件。 获取: 接受:text/css,/;q=0.1 接受编码:gzip,deflate,br 接受语言:es-ES,ES;q=0.8,EN-US;q=0.5,EN;q=0.3 缓存-控制:无缓存 连接:保持活动状态 D

  • 问题内容: 我正在尝试使用(使用最新的Webkit)下载二进制文件,并使用以下简单功能对base64的内容进行编码: 附带说明一下,以上所有内容都是标准Javascript内容,包括和 这工作非常顺利,我什至可以使用Javascript解码base64内容: 现在,我想使用Python解码base64编码的内容,该内容使用一些JSON字符串来获取字符串值。天真的,这就是我的工作: 但是生成的文件无

  • 问题内容: 我有一个Linux设备驱动程序,该驱动程序与一个设备相连,该设备理论上可以使用64位地址执行DMA。我想测试一下是否确实有效。 有没有一种简单的方法可以强制Linux计算机不使用物理地址4G以下的任何内存?如果内核映像位于低内存中就可以了;我只想能够强制我知道所有动态分配的缓冲区,而为我分配的任何内核或用户缓冲区都无法以32位寻址的情况。这有点蛮力,但是比我能想到的任何东西都要全面。

  • 我的应用程序将。jpg文件移动到其他文件夹,并在股票库中查看,我已经发送了广播action_media_mounded

  • 问题内容: 我正在阅读Python内存管理,希望减少应用程序的内存占用。有人建议,子流程可以大大减轻该问题;但是我在概念上需要做些麻烦。可以请一个简单的例子说明如何解决这个问题。 …变成一个 真正的 子处理函数,该函数不存储额外的“自由列表”? 奖励问题: 这个“自由列表”概念也适用于python c扩展吗? 问题答案: 关于优化建议的重要事项是确保仅在子流程中调用该建议。该和是无关的- 一旦你在