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)));
}

Сообщите мне, если я что-то пропустил