9

背景

我正在制作一个应用程序,它将一些图像从 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 ,如此所示。这在任何设备上都不起作用
  • 创建 MediaScannerConnectionClient 的实例并在连接完成后调用 scan ,如此此处所示。不确定这有什么问题,因为它确实连接成功。
  • 调用scanFile,如此处所示有和没有监听器。这在 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 版本?

4

1 回答 1

2

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

Android 团队正在外部和内部跟踪该问题。

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

于 2014-04-15T08:30:01.090 回答