Jak poprawnie powiadomić MediaScanner o folderze, nawet na urządzeniach Nexus / Kitkat?
Tworzę aplikację, która pobiera niektóre obrazy z Internetu do określonego folderu zdefiniowanego jako:
final String pathToPutFiles = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
+ File.separator + DOWNLOAD_FOLDER_NAME;
Chcę, aby galeria i każda aplikacja, która pokazuje media, była powiadamiana o tych obrazach i mogła je wyświetlać.
Niestety mam problemy z Nexusem 4, który ma wersję Kitkat (dokładniej 4.4.2). Czasami działa, a czasem nie.
ProblemIstnieje wiele postów na ten temat, a ja wypróbowałem wiele z nich i żaden z nich nie działał przy użyciu prostej ścieżki do folderu:
używając intencji.ACTION_MEDIA_SCANNER_SCAN_FILE , jak pokazanotutaj . To nie zadziałało na żadnym urządzeniuutworzenie instancji MediaScannerConnectionClient i skanowanie połączenia po wykonaniu połączenia, jak pokazanotutaj itutaj . Nie jestem pewien, co jest z tym nie tak, ponieważ połączenie się udaje.połączeniescanFile , jak pokazanotutaj , zi bez słuchacza. To działało dobrze na Galaxy S3, ale nie na Nexusie 4. To właśnie wybrałem, ale zauważyłem, że nie może działać z pojedynczą ścieżką folderu. Zamiast tego potrzebuje szeregu plików do powiadomienia.Co próbowałemTo właśnie zrobiłem (znowu działa dobrze na Galaxy S3 z Androidem 4.3, ale czasami nie działa na Nexusie 4 z Androidem 4.4.2):
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);
}
}
}
PytanieJak mam zgłosić skanowanie całego folderu?
Dlaczego ta metoda działa tylko czasami w Kitkat? Czy to tylko urządzenia Nexus, czy też inne urządzenia?
Co powinno być używane do obsługi wszystkich urządzeń i wersji Androida?