9

バックグラウンド

インターネットから次のように定義された特定のフォルダーにいくつかの画像をダウンロードするアプリを作成しています。

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

ギャラリーとメディアを表示するアプリを作成して、それらの画像を通知して表示できるようにしたいと考えています。

残念ながら、Kitkat バージョン (正確には 4.4.2) の Nexus 4 で問題が発生しています。うまくいくこともあれば、うまくいかないこともあります。

問題

この問題に関する投稿はたくさんあります。私はそれらの多くを試しましたが、単純なフォルダー パスを使用して機能するものはありませんでした。

  • Intent の意図を使用します。ここに示すACTION_MEDIA_SCANNER_SCAN_FILE。これはどのデバイスでも機能しませんでした
  • ここここに示すように、 MediaScannerConnectionClient のインスタンスを作成し、接続が完了したらスキャンを呼び出します。接続に成功するため、これの何が問題なのかわかりません。
  • ここに示すように、リスナーの有無にかかわらず、 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