Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La imagen, guardada en sdcard, no aparece en la aplicación Galería de Android

Guardo una imagen en la tarjeta sd y no aparece en la aplicación Galería hasta que saque la tarjeta sd y la devuelva.

¿Tienes alguna idea de por qué es así?

Parece que la aplicación Gallery tiene algún caché que no se actualiza en el archivo de guardar

En realidad, también quiero abrir la imagen que acabo de guardar en la aplicación Galería y no tener éxito con eso
Esta es mi pregunta sobre este tema.

  • Cambiar el tamaño de ImageView en el zoom
  • Android - ¿Cómo circular zoom / ampliar parte de la imagen?
  • La carga de Android se puede dibujar mediante programación y cambiar su tamaño
  • Cómo girar un drawable con anti-aliasing habilitado
  • Binarizar imagen en Android
  • Android - Imágenes de la carpeta Activos en un GridView
  • ¿Cómo puedo detectar formas geométricas 2D básicas (por ejemplo, cuadrado, triángulo, círculo) en una imagen JPEG?
  • ¿Cómo configuro una imagen de fondo de ListView vacía?
  • 14 Solutions collect form web for “La imagen, guardada en sdcard, no aparece en la aplicación Galería de Android”

    El sistema escanea la tarjeta SD cuando está montada para encontrar cualquier nueva imagen (y otros) archivos. Si agrega un archivo mediante programación, puede utilizar esta clase:

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

    Una solución más simple es utilizar el método de conveniencia estática scanFile () :

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

    Donde this es su actividad (o cualquier contexto), el tipo mime sólo es necesario si está utilizando extensiones de archivo no estándar y el null es para la devolución de llamada opcional (que no necesitamos para un caso tan simple).

    Mi respuesta a la pregunta original ya cualquier otra persona que pueda tener este problema:

    Yo estaba teniendo este mismo problema, las imágenes en mi aplicación que la gente guardada en la tarjeta SD no se muestran en su galería de inmediato. Después de una cierta búsqueda encontré esta una línea de código insertada después de mi código de "guardar en sdcard" que solucionó el problema:

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

    También puede agregar una imagen a la Galería de medios por intención, eche un vistazo al código de ejemplo para ver cómo se hace:

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

    Actualización de la galería incluyendo 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()))); } 

    Aquí está el código para la MediaScannerConnection:

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

    Newfile es el objeto File del archivo nuevo / guardado.

    Hay una aplicación en el emulador que dice: 'Dev Tools'

    Haga clic en eso y seleccione "Escaneo de medios". Todas las imágenes se escanearán

    Deje que su actividad implemente 'MediaScannerConnectionClient' y añada esto a su actividad:

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

    Aquí estoy compartiendo el código que puede cargar la imagen en forma de mapa de bits de y guardar esa imagen en la galería de sdcard en la carpeta de nombre de la aplicación. Debería seguir estos pasos

    1. Descargar Image Bitmap primero
    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. También proporcione el siguiente permiso en su archivo 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. Aquí está el código completo que está escrito en Activty en el que queremos realizar esta tarea.
    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. Espero que pueda resolver todo su problema.
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 

    No parece funcionar en KITKAT. Se lanza la excepción de denegación de permisos y se bloquea la aplicación. Así que para esto, he hecho lo siguiente,

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

    Espero eso ayude.

    Mi código para MyMediaConnectorClient:

    Public class MyMediaConnectorClient implementa 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(); } 

    }

    Use esto después de guardar la imagen

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

    Este trabajo conmigo

     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); } }); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.