Android Как использовать MediaScannerConnection scanFile - PullRequest
39 голосов
/ 10 января 2011

Я добавляю изображения в папку на SDCARD. Поскольку изображения и моя папка не сразу видны в галерее, я пытаясь заставить MediaScannerConnection обновить и показать папка / изображения в галерее. Это не работает так хорошо для меня, так как ничего не отображается в Галерее. Я только тестирую в Eclipse AVD.

Я не вижу много разговоров об этом, возможно, потому что scanFile является новым с api8. Может кто-нибудь показать, как это делается?

Я пробую это как в службе, так и в Деятельности, но продолжаю получать uri = ноль, когда onScanCompleted.

Ответы [ 9 ]

93 голосов
/ 28 апреля 2011

Я понял, что, возможно, вы искали решение, которое будет работать до уровня API 8, и я не мог понять ответ Митча. Я решил это, создав класс для сканирования одного файла:

import java.io.File;
import android.content.Context;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;

public class SingleMediaScanner implements MediaScannerConnectionClient {

    private MediaScannerConnection mMs;
    private File mFile;

    public SingleMediaScanner(Context context, File f) {
        mFile = f;
        mMs = new MediaScannerConnection(context, this);
        mMs.connect();
    }

    @Override
    public void onMediaScannerConnected() {
        mMs.scanFile(mFile.getAbsolutePath(), null);
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        mMs.disconnect();
    }

}

и вы будете использовать его следующим образом, чтобы MediaScannerConnection сканировал один файл:

new SingleMediaScanner(this, file);
74 голосов
/ 28 апреля 2011

Я искал то же самое и нашел это в ApiDemos, ExternalStorage. Решил все мои проблемы, так как сканирует один файл.

 MediaScannerConnection.scanFile(this,
          new String[] { file.toString() }, null,
          new MediaScannerConnection.OnScanCompletedListener() {
      public void onScanCompleted(String path, Uri uri) {
          Log.i("ExternalStorage", "Scanned " + path + ":");
          Log.i("ExternalStorage", "-> uri=" + uri);
      }
 });
27 голосов
/ 10 января 2011
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
            + Environment.getExternalStorageDirectory()))); 
19 голосов
/ 19 февраля 2014

Или вы можете использовать следующий метод:

private void scanFile(String path) {

        MediaScannerConnection.scanFile(MainActivity.this,
                new String[] { path }, null,
                new MediaScannerConnection.OnScanCompletedListener() {

                    public void onScanCompleted(String path, Uri uri) {
                        Log.i("TAG", "Finished scanning " + path);
                    }
                });
    }

Вызов сканирования файла как:

scanFile(yourFile.getAbsolutePath());
10 голосов
/ 28 января 2011

Не делайте sendBroadcast, если вы хотите, чтобы в галерее появлялось только одно изображение.Это было бы огромной тратой ресурсов.Вам нужно создать MediaScannerConnectionClient, а затем вызвать connect () для MediaScannerConnection, который вы из него делаете, для сканирования файла.Вот пример:

private MediaScannerConnectionClient mediaScannerConnectionClient = 
    new MediaScannerConnectionClient() {

    @Override
    public void onMediaScannerConnected() {
        mediaScannerConnection.scanFile("pathToImage/someImage.jpg", null);
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        if(path.equals("pathToImage/someImage.jpg"))
            mediaScannerConnection.disconnect();
    }
};
new MediaScannerConnection(context, mediaScannerConnectionClient).connect();
4 голосов
/ 01 февраля 2012

Позвольте вашей деятельности реализовать MediaScannerConnectionClient и добавьте это к своей деятельности:

private void startScan() 
{ 
    if(conn!=null) conn.disconnect();  
    conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); 
    conn.connect(); 
} 

@Override 
public void onMediaScannerConnected() { 
    try{
        conn.scanFile(yourImagePath, "image/*");
       } catch (java.lang.IllegalStateException e){
       }
}

@Override 
public void onScanCompleted(String path, Uri uri) { 
    conn.disconnect(); 
} 
1 голос
/ 01 августа 2014

Я написал подробный ответ здесь, Триггер mediascanner по определенному пути (папке), как?

Надеюсь, это отлично решит вашу проблему.

0 голосов
/ 01 декабря 2017

Используйте Intent вместо MediaScannerConnection.MediaScannerConnection сделает ваше приложение gc error с IMediaScannerListener.Stub mListener.

Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri fileContentUri = Uri.parseFile(permFile); // With 'permFile' being the File object
mediaScannerIntent.setData(fileContentUri);
sendBroadcast(mediaScannerIntent);
0 голосов
/ 19 марта 2014
File file = new File(absolutePath);
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(intent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...