Ответ 1
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
Я добавляю изображения в папку на SDCARD. Поскольку изображения и моя папка не отображаются сразу в галерее im пытаясь обновить MediaScannerConnection и показать папку/изображения в галерее. Это не работает так хорошо для меня, поскольку в галерее ничего не появляется. Im только тестирование в Eclipse AVD.
Я не вижу много разговоров об этом, возможно потому, что scanFile является новым с api8. Может ли кто-нибудь показать, как это делается?
Я пытаюсь использовать его как в службе, так и в Activity, но продолжаю получать uri = null, когда onScanCompleted.
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
Я понял, что, возможно, вы искали решение, которое будет работать до уровня 8 уровня api, и я не мог понять ответ Митча. Я решил это, построив класс для сканирования одного файла:
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);
Надеюсь, это поможет.
Я искал одно и то же, и нашел это в 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);
}
});
Или вы можете использовать следующий метод:
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());
Не делайте 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();
Пусть ваша деятельность реализует "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();
}
Я написал подробный ответ здесь, Триггерный медиасканер по определенному пути (папке), как?
Я надеюсь, что он решит вашу проблему отлично.
File file = new File(absolutePath);
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(intent);
Используйте Intent
вместо MediaScannerConnection
. MediaScannerConnection
сделает вашу ошибку gc вашего приложения с 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);