web-dev-qa-db-ja.com

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で権限が不足している可能性がありますか、それともサポートされなくなりましたか?ありがとう

18
BHendricks

別の答え でPetrusが提供するコードは、KitKat(4.4)で動作します。

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);
  }
    });
20
ymonaraS

Environment.getExternalStorageDirectory().toString()を試しましたが、カスタムフォルダーが見つかりませんでした。

私はこの問題を解決するために私の経験を共有したかっただけです。

最後に、一度に1つのファイルをスキャンするように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);
                }
              });
7
user2578151

これを試してください:ファイルをフォルダーに保存した後、以下のコードを記述してください

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("your image path"))));
6
N-Y

以下のコードは、画像を保存した後にギャラリーを更新するためのすべてのデバイスを機能させます。

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"))));
4
Sanjay Bhalani

私は遅いことを知っていますが、これを試してすべてのバージョンで機能することができます:

   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())));
                }
2
WonderSoftwares

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();
}
2
pradeep.k

SendBroadcastの代わりにMediaScannerConnectionを使用します。

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();
0
Arunkumar
 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();