Android: обновление галереи после сохранения новых изображений
Итак, в моем приложении я в один момент сохраняю кучу изображений во временную папку, и я хочу, чтобы они немедленно отображались в Галерее. Они перезагружаются, но в противном случае они этого не делают.
Я пробовал использовать метод sendBroadcast:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
Но я получаю ошибку разрешения:
E/AndroidRuntime( 2628): java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=2628, uid=10068
Могу ли я получить разрешение на моем AndroidManifest, или это больше не поддерживается? Благодаря
Ответы
Ответ 1
Попробуйте это, он работает для меня на Kitkat (4.4) fooobar.com/questions/89971/...
MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {
/*
* (non-Javadoc)
* @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)
*/
public void onScanCompleted(String path, Uri uri)
{
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Ответ 2
Я пробовал Environment.getExternalStorageDirectory().toString()
, но он не нашел мою собственную папку.
Я просто хотел поделиться своим опытом с решением этой проблемы.
В конце у меня было MediaScannerConnection
настроено на сканирование одного файла за раз, и теперь отсутствовала папка, содержавшая эти изображения. Каждый раз, когда я загружаю каждое изображение, я вызывал MediaScannerConnection
и путь к файлу как Uri вместо самой папки.
Кроме того, многие люди спрашивали, почему sendBroadcast
перестает работать на kitkat, и ответ заключается в том, что sendBroadcast
подвергался злоупотреблениям и вызывался слишком много раз и вызывал отказ системы от батареи или замедление, поэтому они удалили прямой вызов, чтобы предотвратить злоупотребление, имеет смысл. Я надеялся использовать вышеуказанное решение в папке, в которой хранятся все изображения, но она не работала в папке. Я надеялся, что папка поиска будет отображать остальную часть файлов в пользовательской папке, но это не было в моем случае. Я надеюсь найти лучший ответ в будущем...
Вот фрагмент моего кода.
MediaScannerConnection.scanFile(ApplicationContext.context, new String[] { imageFile.getPath() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
Log.i(TAG, "Scanned " + path);
}
});
Ответ 3
Попробуйте следующее:
после сохранения файла в папку, напишите ниже код
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
Ответ 4
Внесите MediaScannerConnectionClient и добавьте приведенный ниже код. Прекрасно работает в 4.4:)
MediaScannerConnection conn;
public void startScan(String url) {
imagepath = url;
if (conn != null)
conn.disconnect();
conn = new MediaScannerConnection(activity.this, activity.this);
conn.connect();
}
@Override
public void onMediaScannerConnected() {
try {
conn.scanFile(imagepath, getMimeType(imagepath));
} catch (java.lang.IllegalStateException e) {
//Do something
}
}
@Override
public void onScanCompleted(String path, Uri uri) {
conn.disconnect();
}
Ответ 5
Я знаю его поздно, но попробуйте, это может работать во всех версиях:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Intent mediaScanIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(out); //out is your file you saved/deleted/moved/copied
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
} else {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
}
Ответ 6
Ниже кода работает все устройство для обновления галереи после сохранения изображения.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f1 = new File("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
Uri contentUri = Uri.fromFile(f1);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
} else {
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
Ответ 7
Используйте MediaScannerConnection вместо SendBroadcast..
MediaScannerConnection.MediaScannerConnectionClient(
{
@Override
public void onScanCompleted(String path, Uri uri) {
if (path.equals(**your filename**.getAbsolutePath()))
{
Log.i("Scan Status", "Completed");
Log.i("uri: ",uri.toString());
conn.disconnect();
}
}
@Override
public void onMediaScannerConnected()
{
// TODO Auto-generated method stub
conn.scanFile(**your file name**.getAbsolutePath(),null);
}
});
conn.connect();