web-dev-qa-db-ja.com

SDカードに保存された画像がAndroidギャラリーアプリに表示されない

SDカードに画像を保存しますが、SDカードを取り出して戻すまでギャラリーアプリケーションに表示されません。

なぜそうなのか、ご存知ですか?

Galleryアプリケーションには、ファイルの保存時に更新されないキャッシュがあるようです...

実際には、保存したばかりの画像をギャラリーアプリケーションで開きたいと思います。
this は、この問題に関する私の質問です。

83
Michael Kessler

システムは、マウントされたSDカードをスキャンして、新しいイメージ(およびその他の)ファイルを見つけます。プログラムでファイルを追加する場合、このクラスを使用できます。

http://developer.Android.com/reference/Android/media/MediaScannerConnection.html

42
hackbod

より簡単な解決策は、静的な便利なメソッド scanFile() を使用することです。

File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);

thisはアクティビティ(またはコンテキスト)で、mime-typeは非標準のファイル拡張子を使用している場合にのみ必要です。nullはオプションのコールバック(これは 'このような単純なケースが必要です)。

81
darrenp

元の質問とこの問題を抱えている可能性のある他の人への私の答え:

私はこれと同じ問題を抱えていました。SDカードに保存したアプリの画像がギャラリーにすぐに表示されませんでした。いくつかの検索の後、問題を修正した「SDカードに保存」コードの後に​​次のコード行が挿入されていることがわかりました:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
65
ShadowGod

また、意図的に画像をメディアギャラリーに追加することもできます。サンプルコードを見て、その方法を確認してください。

ContentValues image = new ContentValues();

image.put(Images.Media.TITLE, imageTitle);
image.put(Images.Media.DISPLAY_NAME, imageDisplayName);
image.put(Images.Media.DESCRIPTION, imageDescription);
image.put(Images.Media.DATE_ADDED, dateTaken);
image.put(Images.Media.DATE_TAKEN, dateTaken);
image.put(Images.Media.DATE_MODIFIED, dateTaken);
image.put(Images.Media.MIME_TYPE, "image/png");
image.put(Images.Media.ORIENTATION, 0);

 File parent = imageFile.getParentFile();
 String path = parent.toString().toLowerCase();
 String name = parent.getName().toLowerCase();
 image.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
 image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, name);
 image.put(Images.Media.SIZE, imageFile.length());

 image.put(Images.Media.DATA, imageFile.getAbsolutePath());

 Uri result = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
13
Janusz

Android KitKatを含むギャラリーの更新

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat)
{
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File("file://"+ Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
}
else
{
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
12
AtanuCSE

MediaScannerConnectionのコードは次のとおりです。

MyMediaConnectorClient client = new MyMediaConnectorClient(newfile);
MediaScannerConnection scanner = new MediaScannerConnection(context, client);
client.setScanner(scanner);
scanner.connect();

newfileは、新規/保存ファイルのFileオブジェクトです。

8
3dmg

エミュレータには「開発ツール」というアプリがあります

それをクリックして、「メディアスキャン」を選択します。すべての画像がスキャンされます。

7

アクティビティに「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(); 
} 
6
TOMKA

私とこの仕事

File file = ..... // Save file

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
5
user3245604
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

KitKatでは動作しないようです。 許可拒否例外をスローしますとアプリをクラッシュさせます。そのため、次のことを行いました。

String path = mediaStorageDir.getPath() + File.separator
                    + "IMG_Some_name.jpg";
CameraActivity.this.sendBroadcast(new Intent(
                             Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
                            .parse("file://" + path)));

それが役に立てば幸い。

3
Muhammad Riyaz

ここでは、ビットマップ形式の画像をアプリ名フォルダのSDカードギャラリーに保存して保存できるコードを共有しています。次の手順に従う必要があります

  1. 最初に画像ビットマップをダウンロード



     private Bitmap loadBitmap(String url) {
        try {
            InputStream in = new Java.net.URL(url).openStream();
            return BitmapFactory.decodeStream(in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
       }

  1. また、AndroidManifest.xmlファイルで次の許可を提供してください。


    uses-permission Android:name="Android.permission.INTERNET" 
    uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"

  1. このタスクを実行するActivtyで記述されたコード全体を次に示します。



     void saveMyImage(String appName, String imageUrl, String imageName) {

            Bitmap bmImg = loadBitmap(imageUrl);
            File filename;
            try {
                String path1 = Android.os.Environment.getExternalStorageDirectory()
                        .toString();
                File file = new File(path1 + "/" + appName);
                if (!file.exists())
                    file.mkdirs();
                filename = new File(file.getAbsolutePath() + "/" + imageName
                        + ".jpg");
                FileOutputStream out = new FileOutputStream(filename);
                bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();
                ContentValues image = new ContentValues();
                image.put(Images.Media.TITLE, appName);
                image.put(Images.Media.DISPLAY_NAME, imageName);
                image.put(Images.Media.DESCRIPTION, "App Image");
                image.put(Images.Media.DATE_ADDED, System.currentTimeMillis());
                image.put(Images.Media.MIME_TYPE, "image/jpg");
                image.put(Images.Media.ORIENTATION, 0);
                File parent = filename.getParentFile();
                image.put(Images.ImageColumns.BUCKET_ID, parent.toString()
                        .toLowerCase().hashCode());
                image.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, parent.getName()
                        .toLowerCase());
                image.put(Images.Media.SIZE, filename.length());
                image.put(Images.Media.DATA, filename.getAbsolutePath());
                Uri result = getContentResolver().insert(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, image);
                Toast.makeText(getApplicationContext(),
                        "File is Saved in  " + filename, Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

  1. それがあなたの問題全体を解決できることを願っています。
3
VISHNU GARG
 File folderGIF = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/newgif2");    //path where gif will be stored
success = folderGIF.mkdir();    //make directory
 String finalPath = folderGIF + "/test1.gif";  //path of file
.....
/* changes in gallery app if any changes in done*/
 MediaScannerConnection.scanFile(this,
                    new String[]{finalPath}, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                            Log.i("ExternalStorage", "Scanned " + path + ":");
                            Log.i("ExternalStorage", "-> uri=" + uri);
                        }
                    });
3
Khyati Fatania

MyMediaConnectorClientの私のコード:

public class MyMediaConnectorClient implements MediaScannerConnectionClient {

    String _fisier;
    MediaScannerConnection MEDIA_SCANNER_CONNECTION;

    public MyMediaConnectorClient(String nume) {
        _fisier = nume;
    }

    public void setScanner(MediaScannerConnection msc){
        MEDIA_SCANNER_CONNECTION = msc;
    }

    @Override
    public void onMediaScannerConnected() {
        MEDIA_SCANNER_CONNECTION.scanFile(_fisier, null);
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        if(path.equals(_fisier))
            MEDIA_SCANNER_CONNECTION.disconnect();
    }
}
2
Marian

画像を保存した後にこれを使用してください

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
2
Deepu

ギャラリーアプリに権限を付与する必要があります。ホーム画面でギャラリーアプリアイコンを長押しし、画面上部にポップアップする[アプリ情報]をタップします。それを行うと、ギャラリーアプリの設定が表示されます。 [アクセス許可]タブに移動し、ストレージを有効にして、カメラのアクセス許可を切り替えます。ネイティブギャラリーアプリに移動すると、保存した画像が取得されます。

0
Devanshu Jain