Cómo evitar que el escáner multimedia escanee JPG Descargado con DownloadManager en Android? (Desarrollador)

Mi aplicación descarga jpgs desde un sitio web utilizando DownloadManager y los almacena en el directorio /sdcard/Android/name.app/ para ser utilizado en varios fragmentos de la aplicación. La descarga funciona muy bien, sin embargo, los jpgs son visibles en la aplicación de Galería, que no quiero, ya que son sólo los activos de mi aplicación. No puedo averiguar cómo hacer que no aparezcan en la aplicación Galería. Incluso he intentado agregar archivos .nomedia a los directorios son son creados. ¡Cualquier ayuda sería apreciada!

DownloadManager myDownloadManager = (DownloadManager) myActivity.getSystemService(Context.DOWNLOAD_SERVICE); Request myRequest = new Request(Uri.parse(episodeArtLink)); myRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN); myRequest.setVisibleInDownloadsUi(false); myRequest.setDestinationInExternalFilesDir(myActivity, Environment.DIRECTORY_DOWNLOADS, myFilename); myDownloadManager.enqueue(myRequest); 

Los problemas parecen estar causados ​​porque MediaScanner está agregando las imágenes a la base de datos del sistema, aunque no se lo he pedido.

He creado una aplicación de prueba que demuestra el problema. Si hace clic en el botón Descargar, aparecerá el logotipo de Google en la aplicación. Si vas a la aplicación Galería, también deberás ver el logotipo de Google en una galería llamada Descargar. Si va a Ajustes -> Aplicaciones y Borrar los datos para Galería y almacenamiento de medios, el logotipo de Google desaparecerá y no se mostrará de nuevo en la Galería porque el archivo está bajo / sdcard / Android / data / que está protegido por Archivo .nomedia. Puede ir a /sdcard/Android/data/com.example.downloadmanagertest/files/Download/ para verificar que las imágenes todavía están en el teléfono. Incluso después de un reinicio las imágenes no aparecen en la Galería si borra los datos de Galería y Almacenamiento de medios. He probado esto en un Nexus 4 y un Nexus 7 que funciona 4.2.2.

Fuente: https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip

Solución

El escáner de medios, tarde o temprano, explorará la tarjeta de medios para los medios y los indexará. El primer paso intuitivo es engañar al escáner para que no sepa que el archivo es un archivo multimedia. Esto se puede lograr guardando las imágenes sin la extensión. Una solución fácil sería añadir notkevin al final del nombre de archivo. Simplemente:

En lugar de

  myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, Uri.parse(downloadLink).getLastPathSegment()); 

Utilizar esta

  String filename = Uri.parse(downloadLink).getLastPathSegment() + "notkevin"; myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, filename); 

Sin embargo esto no es suficiente en su caso ya que está utilizando el DownloadManager (sólo una suposición). El escáner de medios de alguna manera sabe sobre el elemento descargado y el hecho de que es una imagen y, por lo tanto, los índices. Para no permitirlo, use setMimeType como este:

 myRequest.setMimeType("application/octet-stream"); 

PS: Hay maneras de cambiar la extensión que no sea agregar tu nombre o mi nombre al final del nombre de archivo. Por ejemplo, podría hash el nombre de archivo

 String filename = hash(Uri.parse(downloadLink).getLastPathSegment()); public String hash(String victim) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA1"); md.reset(); byte[] buffer = victim.getBytes(); md.update(buffer); byte[] digest = md.digest(); StringBuilder hexStr = new StringBuilder(); for (int i = 0; i < digest.length; i++) { hexStr.append(Integer.toString( ( digest[i] & 0xff ) + 0x100, 16).substring( 1 )); } return hexStr.toString(); } 

He estado en este mismo problema por unos días. He intentado casi todas las combinaciones de crear directorios ocultos , usar diferentes extensiones , poner archivos .nomedia en los directorios de root y directorios de imágenes , crear la .nomedia antes de descargar , renombrar el directorio (de ida y vuelta) .

Lamentablemente ninguno de estos parece funcionar para mí (en el Nexus 4). Mi comprensión es que el MediaScanner sólo hace un nuevo escaneo al arrancar el teléfono o montar el almacenamiento externo. En un Nexus 4 (o cualquier dispositivo que no tenga ranura de tarjeta SD) este montaje sólo ocurre en el momento del arranque.

Sin embargo, los archivos descargados con el Administrador de descargas Android se analizan inmediatamente (aunque no deberían ) y se colocan en la galería. Incluso si tiene el archivo .nomedia que todavía terminan en la galería. La desinstalación de la aplicación no ayuda ya que las imágenes en miniatura siguen en caché (puede quitarlas sin reiniciar eliminando la caché, los datos y forzando el cierre de las aplicaciones de Galería y almacenamiento de medios en la configuración). Si reinicia el teléfono, Android recupera el almacenamiento externo, ve que hay un archivo .nomedia y lo elimina de la galería.

Así que este reinicio / rescan un poco soluciona el problema. Sin embargo, no queremos estar constantemente pidiendo a los usuarios que reinicien el teléfono, así que lo que funcionó para mí fue obligar a Android a volver a explorar el almacenamiento externo después de las descargas exitosas con:

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

Lo que recibí de la respuesta de Darshan a una pregunta similar y Jon .

He configurado un receptor de difusión para escuchar las descargas completadas y si tienen éxito, envío la emisión. Parece que funciona – las imágenes descargadas en mi aplicación ya no aparecen en la galería.

Prefija el nombre de su carpeta con un punto (/sdcard/Android/name.app/.photos/). Si eso no funciona, intente ocultar su carpeta.

https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/ImageLoader.java

Mira los métodos con nombres como getphoto, getbitmap en el enlace anterior. El proyecto de github de LazyLoader tiene todos los métodos que necesitarías tweek usar sugerencias en otras respuestas para traer medios del WEB, al escondite (memoria, sistema de archivos) ya utilizar mapas de bits como necesitas en tu app.

En los archivos de archivos, donde los mapas de bits persisten, sólo adopte los nombres de archivo que serán reconocidos como necesarios por sus módulos, PERO NO RECONOCEN por el escáner de medios.

Deberias hacer eso.

También puede poner su carpeta entera a ser sin tocar por el escáner sin tener un cambio en sus extensiones de archivo. Consulte el archivo ".nomedia" en este enlace ;

Ocultar tus archivos desde el escáner multimedia

Incluya un archivo vacío denominado .nomedia en su directorio de archivos externos (tenga en cuenta el prefijo de punto en el nombre de archivo). Esto evita que el escáner de medios lea sus archivos multimedia y los proporcione a otras aplicaciones a través del proveedor de contenido de MediaStore. Sin embargo, si tus archivos son verdaderamente privados para tu aplicación, debes guardarlos en un directorio privado de la aplicación.

  • Android2.3 DescargarManager
  • Cómo pausar y reanudar DownloadManager
  • ¿Está bien consultar el DownloadManager en el subproceso de interfaz de usuario?
  • ¿Hay acción de Pausa para el Administrador de descargas en Android?
  • ¿Por qué desaparece la notificación de "descarga completada" en los dispositivos Gingerbread?
  • BroadcastReceiver onReceive () se llama dos veces
  • Cómo habilitar Android Download Manager
  • Cómo descargar el archivo multimedia en formato m3u8 en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.