我正在尝试将图像从我的应用程序保存到手机的默认图库中。如果手机上有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);
然而,有趣的是,变量uriOfSucessfulySavedImage
不为空(它返回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;
}
答案 0 :(得分:4)
我没试过这个,但我相信您需要运行Media Scanner来扫描内部存储目录,以便图库可以看到您新保存的图像。在此处查看此post。
答案 1 :(得分:2)
另一种简单的方法。保存文件后添加此内容。
File imageFile = ...
MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);
答案 2 :(得分:0)
试试这个。
一旦图像存储在图库中,请记下此行。
File file = ..... // Save file
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
答案 3 :(得分: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())));
}
答案 4 :(得分:0)
在活动中复制过去此功能
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());