Trigger mediascanner по определенному пути (папке), как?
Я получил этот класс:
import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.util.Log;
public class MediaScannerWrapper implements
MediaScannerConnection.MediaScannerConnectionClient {
private MediaScannerConnection mConnection;
private String mPath;
private String mMimeType;
// filePath - where to scan;
// mime type of media to scan i.e. "image/jpeg".
// use "*/*" for any media
public MediaScannerWrapper(Context ctx, String filePath, String mime){
mPath = "/sdcard/DCIM/Camera";
mMimeType = "jpg";
mConnection = new MediaScannerConnection(ctx, this);
}
// do the scanning
public void scan() {
mConnection.connect();
}
// start the scan when scanner is ready
public void onMediaScannerConnected() {
mConnection.scanFile(mPath, mMimeType);
Log.w("MediaScannerWrapper", "media file scanned: " + mPath);
}
public void onScanCompleted(String path, Uri uri) {
// when scan is completes, update media file tags
}
}
Как использовать его в другом классе?
Я не знаю, как правильно использовать классы, я пытался, но ничего не работает.
Я делаю что-то не так, но я не знаю, что, кто-то может мне помочь с этим.
Ответы
Ответ 1
Эй, я узнал, как это сделать с очень простым кодом.
Просто позвоните в эту строку кода:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Это должно запускать медиаскандер.
Ответ 2
История
Перед Android 4.4 мы могли просто отправить широковещательную рассылку, чтобы запустить медиа-сканер в любом конкретном файле, папке или даже в корневом каталоге хранилища. Но с 4.4 KitKat это было исправлено разработчиками Android.
Почему я говорю исправление? Причина проста. Отправка широковещательной рассылки с помощью MEDIA_MOUNTED в корневом каталоге очень дорого. Запуск Media Scanner - это дорогостоящая операция, и ситуация становится еще хуже, когда пользователь имеет много файлов в структурах хранения и глубоких папок.
Перед Android 4.4
Держите это прямо и просто. Если вы настроили таргетинг на свое приложение до Android 4.4. Но имейте в виду не использовать его в корневом каталоге, если это абсолютно необходимо.
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
От Android 4.4
Есть два способа для вас.
i) Первый из них очень похож на предыдущий пример, но может не работать эффективно и не рекомендуется также.
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
ii) Теперь давайте перейдем к наиболее рекомендуемому и эффективному решению этой проблемы.
Добавьте пути к файлам файлов, которые были обновлены, например, в String type ArrayList
ArrayList<String> toBeScanned = new ArrayList<String>();
toBeScanned.add(item.getFilePath());
Теперь вам нужно запустить staticFlashFile() статический метод класса MediaScannerConnection и передать массив String, содержащий список всех файлов, которые были обновлены и должны быть сканированы.
Вы также можете отправить слушателю ответ, когда сканирование будет завершено для отдельных файлов.
String[] toBeScannedStr = new String[toBeScanned.size()];
toBeScannedStr = toBeScanned.toArray(toBeScannedStr);
MediaScannerConnection.scanFile(getActivity(), toBeScannedStr, null, new OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
System.out.println("SCAN COMPLETED: " + path);
}
});
Ответ 3
В Android существует база данных контента, которая используется медиаплеером для отслеживания всех медиаконтента, присутствующих на устройстве.
Когда Android загружается, служба mediascanner запускается и проходит через всю внешнюю память, чтобы найти, есть ли новый медиа-контент, если он найдет его,
- Он добавляет запись этого медиаконтента в базу данных контента
- Каждая запись в базе данных контента содержит метаданные медиаконтента, такие как имя, дата, размер файла, тип файла и т.д.
- Поэтому, когда вы вносите изменения в мультимедийный контент, вам также необходимо обновить базу данных контента.
- Если база данных контента не обновляется, другие приложения также не смогут получить доступ к этому конкретному медиаконтенту.
- Запуск медиа-сканера просто обновляет базу данных контента
Вместо запуска медиа-сканера вы можете самостоятельно обновить базу данных контента и решить эту проблему.
Ниже приведено описание о том, как вставлять, удалять, обновлять с помощью распознавателя контента. (Найдите раздел "Вставка, обновление и удаление данных" )
Edit:
В этом ответе есть пример кода. Проверьте ответ Януша.
Ответ 4
File file = new File(absolutePath);
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(intent);
Ответ 5
private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
Ссылка: http://developer.android.com/training/camera/photobasics.html#TaskGallery
Раздел Add the Photo to a Gallery
Ответ 6
Как говорит @Aritra Roy, я решил сделать эксперимент по этой проблеме.
Я получил здесь:
- Intent.ACTION_MEDIA_MOUNTED и Intent.ACTION_MEDIA_SCANNER_SCAN_FILE
может принимать индивидуальный путь к файлу, поэтому sendBroadcast (новый
Intent (Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(filePath)));
или sendBroadcast (новый Intent (Intent.ACTION_MEDIA_MOUNTED,
Uri.parse(Filepath))); будут действительны.
- Если вы используете индивидуальный путь к файлу с Intent.ACTION_MEDIA_MOUNTED на Kitkat или выше, ваше приложение все равно будет терпеть крах
- Если вы используете Intent.ACTION_MEDIA_SCANNER_SCAN_FILE или MediaScannerConnection на устройстве ниже, чем Kitkat, ваше приложение не будет принудительно закрываться, но метод просто не будет работать так, как вы хотите.
Из этого эксперимента я считаю, что лучший способ обработки -
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
MediaScannerConnection.scanFile(context, new String[]{imagePath}, null, new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
//something that you want to do
}
});
} else {
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + imagePath)));
}
Сообщите мне, если я что-то пропустил