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, или это просто больше не поддерживается? Спасибо
8 ответов
Попробуйте это, у меня работает на Kitkat (4.4) /questions/3194935/android-kak-ispolzovat-mediascannerconnection-scanfile/3194951#3194951
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);
}
});
Я старался Environment.getExternalStorageDirectory().toString()
, но он не нашел мою собственную папку.
Я просто хотел поделиться своим опытом по решению этой проблемы.
В конце концов, я имел MediaScannerConnection
настроен для сканирования по одному файлу за раз, и теперь появляется отсутствующая папка, в которой хранятся эти изображения. Каждый раз, когда я загружаю каждое изображение, я звонил MediaScannerConnection
и путь к файлу как Uri вместо самой папки.
Кроме того, многие люди спрашивают, почему sendBroadcast
перестань работать на киткат и ответ таков 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);
}
});
Попробуйте это: после сохранения вашего файла в папку, напишите ниже код
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
Ниже кода работают все устройства для обновления галереи после сохранения изображения.
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"))));
Реализуйте 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();
}
Я знаю, что поздно, но попробовать это может работать во всех версиях:
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())));
}
Используйте 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();
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
//Gallery Refresh Code
MediaScannerConnection.scanFile(getActivity(), 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);
}
});
out.close();