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();
Другие вопросы по тегам