Я сохраняю изображение на SD-карту, и оно не отображается в приложении Галерея, пока я не сниму SD-карту и не верну ее обратно.
Вы хоть представляете, почему это так?
Похоже, в приложении Галерея есть кеш, который не обновляется при сохранении файла ...
На самом деле, я также хочу открыть только что сохраненное изображение в приложении "Галерея", и мне это не удалось.
Это мой вопрос по этой проблеме.
Ответы:
Система сканирует 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-карту, не сразу отображались в их галерее. После некоторого поиска я нашел эту одну строку кода, вставленную после моего кода «сохранить на 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);
источник
Uri
но проблема в том, что вставленное изображение не отображается в галерее. Проверял и в начале, и в конце галереи. Не могли бы вы предложить какой-либо метод, чтобы вставленное изображение сразу же появилось в галерее?Обновление галереи, включая 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 вашего нового / сохраненного файла.
источник
MyMediaConnectorClient
...в эмуляторе есть приложение с надписью "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(); }
источник
Uri
изображение, например:content://media/external/images/media/1231778
эта работа со мной
File file = ..... // Save file context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
источник
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); } });
источник
Здесь я делюсь кодом, который может загружать изображение в виде растрового изображения и сохранять это изображение в галерее 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; }
uses-permission android:name="android.permission.INTERNET" uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
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)));
Надеюсь, это поможет.
источник
Используйте это после сохранения изображения
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
источник
Мой код для MyMediaConnectorClient:
public class MyMediaConnectorClient implements 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(); } }
источник
Вам необходимо предоставить разрешения приложению Галерея. Просто нажмите и удерживайте значок приложения галереи на главном экране и нажмите «ИНФОРМАЦИЯ О ПРИЛОЖЕНИИ», которая появляется в верхней части экрана. Откроются настройки приложения галереи. Теперь перейдите на вкладку «Разрешения» и включите хранилище, разрешения камеры, переключив его. Теперь перейдите в свое собственное приложение галереи, и вы получите сохраненные изображения.
источник
Это также решит вашу проблему, если ваше изображение в галерее не отображается, вместо этого они могут отображать растровое изображение типа 404 в середине. добавьте теги, которые есть в моем коде, к вашему изображению, потому что для отображения изображения в галерее необходимы некоторые метаданные.
String resultPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)+ getString(R.string.directory) + System.currentTimeMillis() + ".jpg"; new File(resultPath).getParentFile().mkdir(); try { OutputStream fileOutputStream = new FileOutputStream(resultPath); savedBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); } catch (IOException e2) { e2.printStackTrace(); } savedBitmap.recycle(); File file = new File(resultPath); ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, "Photo"); values.put(MediaStore.Images.Media.DESCRIPTION, "Edited"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis ()); values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis()); values.put(MediaStore.Images.ImageColumns.BUCKET_ID, file.toString().toLowerCase(Locale.US).hashCode()); values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, file.getName().toLowerCase(Locale.US)); values.put("_data", resultPath); ContentResolver cr = getContentResolver(); cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); return resultPath;
источник
Попробуйте этот, он будет транслировать о новом созданном изображении, чтобы ваше изображение было видно. внутри галереи. photoFile замените фактическим путем к файлу вновь созданного изображения
private void galleryAddPicBroadCast() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri contentUri = Uri.fromFile(photoFile); mediaScanIntent.setData(contentUri); this.sendBroadcast(mediaScanIntent); }
источник