Изображения, сохраненные на карту памяти, не отображаются в Android приложение Галерея
Я сохраняю изображение на SD-карту, и оно не появляется в приложении галереи, пока я не вытащу SD-карту и не верну ее обратно.
У вас есть какие-либо идеи, почему это так?
похоже, что приложение галереи имеет некоторый кэш, который не обновляется при сохранении файла...
на самом деле, я также хочу, чтобы открыть только что сохраненное изображение в приложении галереи и не имеют успеха с этим
это мой вопрос об этой проблеме.
15 ответов:
система сканирует SD-карту, когда она установлена, чтобы найти любые новые изображения (и другие) файлы. Если вы программно добавляете файл, то вы можете использовать этот класс:
http://developer.android.com/reference/android/media/MediaScannerConnection.html
более простым решением является использование статического метода удобства scanFile():
File imageFile = ... MediaScannerConnection.scanFile(this, new String[] { imageFile.getPath() }, new String[] { "image/jpeg" }, null);здесь
thisявляется ли ваша деятельность (или какой-либо контекст), тип mime необходим только в том случае, если вы используете нестандартные расширения файлов иnullдля дополнительного обратного вызова (который нам не нужен для такой простой случай).
мой ответ на исходный вопрос и всем, кто может иметь эту проблему:
У меня была такая же проблема, изображения в моем приложении, которые люди сохраняли на SD-карте, не сразу появлялись в их галерее. После некоторого поиска я нашел эту строку кода, вставленную после моего кода "сохранить на sdcard", который исправил проблему:
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 - это объект файла вашего нового / сохраненного файла.
в эмуляторе есть приложение, которое говорит - 'Dev Tools'
нажмите на это и выберите "сканирование мультимедиа".. все изображения будут сканироваться
пусть ваша деятельность реализовать "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(); }
эта работа со мной
File file = ..... // Save file context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
здесь я разделяю код, который может загружать изображение в виде растрового изображения и сохранять это изображение в галерее sdcard в папке имени приложения. Вы должны выполнить следующие действия
- сначала загрузите растровое изображение
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; }
- Пожалуйста, также предоставьте следующее разрешение в вашем AndroidManifest.XML-файл.
uses-permission android:name="android.permission.INTERNET" uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
- вот весь код, который написан в Activty, в котором мы хотим выполнить это задача.
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(); } }
- надеюсь, что это может решить всю вашу проблему.
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));Кажется, не работает на KITKAT. он выдает исключение отказа в разрешении и аварийно завершает работу приложения. Поэтому для этого я сделал следующее,
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 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); } });
мой код для 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())));
вам нужно дать разрешения на приложение галереи. Просто нажмите и удерживайте значок приложения галереи на главном экране и нажмите "Информация о приложении", которая появляется в верхней части экрана. Это покажет настройки приложения галереи. Теперь перейдите на вкладку разрешения и включите хранилище, разрешения камеры, переключив его. Теперь перейти в приложение Галерея, и вы получите ваши сохраненные изображения.
Comments