我正在尝试将应用程序中的图像保存到手机默认相册。如果手机上有SD卡,下面的代码可以完美地工作。保存的图像将出现在手机的相册中,一切都符合预期:
然而,如果我尝试将同一张图片保存到内部存储(用于手机没有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卡的情况下),图片不会出现在手机的相册中!为了尝试这样做,我只需更改上述代码中的一行:
uriOfSucessfulySavedImage = c.insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, v);
然而,有趣的是变量uriOfSuccessfulSavedImage
不是null(它返回content://media/internal/images/media/x
,这里的'x'是一个数字)。因此,图片被保存在手机的内部存储器中的某个地方,但当我使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI
时,它没有显示在手机相册中。
有人知道发生了什么吗?我如何将图片保存到手机的内部存储器并将其显示在手机相册中?
更新
我忘记了一个重要信息。方法"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;
}