バックグラウンド
インターネットから次のように定義された特定のフォルダーにいくつかの画像をダウンロードするアプリを作成しています。
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 バージョンをサポートするには、何を使用する必要がありますか?