アプリケーションから携帯電話のデフォルトのギャラリーに画像を保存しようとしています。電話に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;
}