如何正确地通知MediaScanner有关文件夹的信息,即使在Nexus / Kitkat设备上也是如此?

时间:2014-01-19 12:17:26

标签: android directory android-4.4-kitkat android-mediascanner

背景

我正在创建一个应用程序,将一些图像从Internet下载到一个定义为的特定文件夹中:

final String pathToPutFiles = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
            + File.separator + DOWNLOAD_FOLDER_NAME;

我希望制作图库和任何展示媒体的应用,以获得这些图片的通知,并能够展示它们。

可悲的是,我在Nexus 4上遇到了问题,它有Kitkat版本(确切地说是4.4.2)。有时候它会起作用,有时却不起作用。

问题

有很多关于这个问题的帖子,我尝试过很多帖子,没有人使用简单的文件夹路径:

  • 使用Intent。ACTION_MEDIA_SCANNER_SCAN_FILE的意图,如图here所示。这不适用于任何设备
  • 创建MediaScannerConnectionClient实例并在连接完成后调用扫描,如herehere所示。不知道这有什么问题,因为它确实成功连接。
  • 调用scanFile,如图所示here,有或没有听众。这在Galaxy S3上运行良好,但在Nexus 4上运行不正常。这是我选择做的,但我注意到它不适用于单个文件夹路径。相反,它需要一组文件来通知。

我尝试了什么

这就是我所做的(同样,它适用于具有Android 4.3的Galaxy S3,但有时不适用于具有Android 4.4.2的Nexus 4):

protected void notifyMediaScannerOfNewImageFiles(final String folderPathToScan) {
        final ArrayList<String> newFilesToScan = new ArrayList<String>();
        preparePaths(folderPathToScan, newFilesToScan, true);
        final String[] newFilesToScanArr = newFilesToScan.toArray(new String[newFilesToScan.size()]);
        MediaScannerConnection.scanFile(getApplicationContext(), newFilesToScanArr, null, null);
}

public static void preparePathsForMediaScanning(final String folderPathToScan, final Collection<String> pathsToFill,
        final boolean recursive) {
    if (TextUtils.isEmpty(folderPathToScan))
        return;
    final File folderToScan = new File(folderPathToScan);
    if (!folderToScan.exists())
        return;
    pathsToFill.add(folderPathToScan);
    if (!folderToScan.isDirectory())
        return;
    final File[] childrenFiles = folderToScan.listFiles();
    if (childrenFiles == null || childrenFiles.length == 0)
        return;
    for (final File childFile : childrenFiles) {
        if (childFile.exists()) {
            final String childFilePath = childFile.getAbsolutePath();
            pathsToFill.add(childFilePath);
            if (recursive && childFile.isDirectory())
                preparePathsForMediaScanning(childFilePath, pathsToFill, true);
        }
    }
}

问题

我应该如何通知要扫描的整个文件夹?

为什么这种方法有时只适用于Kitkat?它只是Nexus设备还是其他设备?

应该使用什么来支持所有设备和Android版本?

1 个答案:

答案 0 :(得分:2)

到目前为止,我已经在很长一段时间内解决了这个问题。正如在this SO anwser上发布的那样,它似乎是KitKat上发生的错误。

Android团队正在外部和内部跟踪issue

与此同时,这是我发现的:https://stackoverflow.com/a/23078323/1367571