4

アプリケーションから携帯電話のデフォルトのギャラリーに画像を保存しようとしています。電話にSDカードがある場合、以下のコードは完全に機能します。保存された画像は、期待どおりに携帯電話のギャラリーとすべてに表示されます。

private Uri saveMediaEntry(File f, String title, String description, int orientation,      Location loc) {

    ContentValues v = new ContentValues();
    v.put(Images.Media.TITLE, title);
    v.put(Images.Media.DISPLAY_NAME, title);
    v.put(Images.Media.DESCRIPTION, description);

    v.put(Images.Media.ORIENTATION, orientation);

    String nameFile = f.getName();
    File parent = f.getParentFile() ;
    String path = parent.toString().toLowerCase() ;
    String nameParent = parent.getName().toLowerCase() ;
    v.put(Images.ImageColumns.BUCKET_ID, path.hashCode());
    v.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, nameParent);
    v.put(Images.Media.SIZE,f.length()) ;

    if( nameFile.toLowerCase().contains(".png") ){
        v.put(Images.Media.MIME_TYPE, "image/png");

    }else if( nameFile.toLowerCase().contains(".jpg") || 
              nameFile.toLowerCase().contains(".jpeg") ){
         v.put(Images.Media.MIME_TYPE, "image/jpeg");

    }else{
        v.put(Images.Media.MIME_TYPE, "image/jpeg");
    }

    String imagePath = f.getAbsolutePath();
    v.put("_data", imagePath) ;
    ContentResolver c = getContentResolver() ;

    Uri uriOfSucessfulySavedImage = null;
    uriOfSucessfulySavedImage = c.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, v);

    return uriOfSucessfulySavedImage;
  }

ただし、同じ画像を内部ストレージに保存しようとすると(電話にSDカードがない場合)、画像が電話のギャラリーに表示されません。これを行うために、上記のコードから1行だけ変更します。

uriOfSucessfulySavedImage = c.insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, v);

ただし、これに関する興味深い点は、変数uriOfSucessfulySavedImageがnullではないことです( content://media/internal/images/media/x「x」は数値である、を返します)。そのため、画像は電話の内部ストレージのどこかに保存されていますが、私が使用しているときのように電話ギャラリーに表示されませんMediaStore.Images.Media.EXTERNAL_CONTENT_URI

誰かが何が起こっているのか手がかりを持っていますか?画像を携帯電話の内部ストレージに保存し、その画像を携帯電話のギャラリーに保存するにはどうすればよいですか?

アップデート

重要な情報を1つ忘れてしまいました。メソッド「saveMediaEntry」のパラメーターのファイル「f」は、SDカードがマウントされているとき(つまり、最初のコード用)のこの他のメソッドからのものです。

public static File getCacheDirectory(String desiredNameOfTheDirectory){

File fileCacheDir = null;

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ){

        fileCacheDir = new File( Environment.getExternalStorageDirectory(), desiredNameOfTheDirectory );
   }


    if(!fileCacheDir.exists()){
        fileCacheDir.mkdirs();
    }

    return fileCacheDir;
}

SDカードが見つからない場合の次のコードから:

public static File getCacheDirectory(String desiredNameOfTheDirectory, Context   context){

    File fileCacheDir = null;

        fileCacheDir = context.getCacheDir();

    if(!fileCacheDir.exists()){
        fileCacheDir.mkdirs();
    }

    return fileCacheDir;
}
4

5 に答える 5

6

それを行う別の簡単な方法。ファイルを保存した後にこれを追加します。

File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);
于 2014-04-09T02:11:37.890 に答える
4

私はこれを試していませんが、ギャラリーが新しく保存された画像を表示できるように、メディアスキャナーを実行して内部ストレージディレクトリをスキャンする必要があると思います。こちらの投稿を確認してください。

于 2012-07-19T02:49:17.143 に答える
2

アクティビティでこの関数を超えてコピーする

private void scanner(String path) {

        MediaScannerConnection.scanFile(FrameActivity.this,
                new String[] { path }, null,
                new MediaScannerConnection.OnScanCompletedListener() {

                    public void onScanCompleted(String path, Uri uri) {
                        Log.i("TAG", "Finished scanning " + path);
                    }
                });
    }

次に、画像を保存する場所にこの行を追加します

scanner(imageFile.getAbsolutePath());
于 2018-01-31T13:32:44.023 に答える
0

これを試して。

画像がギャラリーに保存されたら、この行を書き留めます。

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

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
于 2015-03-27T08:19:59.907 に答える
0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

                sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                        Uri.parse("file://"
                                + Environment.getExternalStorageDirectory())));
            } else {
                sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                        Uri.parse("file://"
                                + Environment.getExternalStorageDirectory())));
            }
于 2015-08-09T08:34:03.113 に答える