保存到SD卡的图像不会出现在Android的图库应用程序中

我将图像保存到SD卡,它不会出现在图库应用程序,直到我拉出SD卡,并将其返回。

你知道这是为什么吗?

看起来像图库应用程序有一些caching没有更新文件保存…

其实,我也想在Gallery应用程序中打开刚刚保存的图像,并没有成功
这是我关于这个问题的问题。

系统在安装时会扫描SD卡以查找任何新图像(和其他)文件。 如果你正在以编程的方式添加一个文件,那么你可以使用这个类:

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

更简单的解决scheme是使用静态便捷方法scanFile() :

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

this是你的活动(或任何上下文),只有当你使用非标准的文件扩展名时,mimetypes是必须的,而null是可选的callback(我们不需要这样一个简单的情况)。

我对原始问题的回答以及任何可能有此问题的人:

我有这个问题,我的应用程序中的图像,保存到SD卡的人没有立即出现在他们的画廊。 经过一番search,我发现这一行代码后,我的“保存到SD卡”的代码,解决了这个问题:

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

您也可以通过意图将图像添加到媒体库中,查看示例代码以了解它是如何完成的:

 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); 

包含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()))); } 

以下是MediaScannerConnection的代码:

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

newfile是新的/保存的文件的File对象。

在模拟器中有一个应用程序说:“开发工具”

点击它并select'媒体扫描'..所有的图像将被扫描

让您的活动实施“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(); } 

在这里,我共享代码,可以加载位graphics式的图像,并将该图像保存在应用程序名称文件夹中的SD卡库上。 你应该按照这些步骤

  1. 首先下载Image Bitmap
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; }
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"
uses-permission android:name="android.permission.INTERNET" uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
  1. 这里是我们想要执行这个任务的完整的代码。
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(); } }
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. 希望它能解决你的整个问题。
 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 

似乎不适用于KITKAT。 它引发权限拒绝exception并崩溃应用程序。 为此,我做了以下工作,

 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))); 

希望它有帮助。

这个和我一起工作

 File file = ..... // Save file context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); 

我的代码为MyMediaConnectorClient:

公共类MyMediaConnectorClient实现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(); } 

}

保存图像后使用这个

 sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 
  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); } });