Activar el escáner de medios en una ruta específica (carpeta), ¿cómo hacerlo?

7 minutos de lectura

Activar el escaner de medios en una ruta especifica carpeta
flujo grande

Tengo esta clase:

import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.util.Log;

public class MediaScannerWrapper implements  
MediaScannerConnection.MediaScannerConnectionClient {
    private MediaScannerConnection mConnection;
    private String mPath;
    private String mMimeType;


    // filePath - where to scan; 
    // mime type of media to scan i.e. "image/jpeg". 
    // use "*/*" for any media
    public MediaScannerWrapper(Context ctx, String filePath, String mime){
        mPath = "/sdcard/DCIM/Camera";
        mMimeType = "jpg";
        mConnection = new MediaScannerConnection(ctx, this);
    }

    // do the scanning
    public void scan() {
        mConnection.connect();
    }

    // start the scan when scanner is ready
    public void onMediaScannerConnected() {
        mConnection.scanFile(mPath, mMimeType);
        Log.w("MediaScannerWrapper", "media file scanned: " + mPath);
    }

    public void onScanCompleted(String path, Uri uri) {
        // when scan is completes, update media file tags
    }
}

¿Cómo usarlo en la otra clase? No sé cómo usar correctamente las clases, lo intenté pero nada funciona. Hice algo mal, pero no sé qué, alguien puede ayudarme con esto.

  • ¿Estás hablando de esa publicación?

    – XMoby

    23 feb. 12 a las 16:34

  • Oh, no encontré esa publicación, ¡gracias!

    – Gran flujo

    24 feb.

  • ¿Todavía podría ayudarme? Soy realmente malo con las clases y esas cosas en Java.

    – Gran flujo

    24 feb.

  • ¿Qué es lo que quieres hacer exactamente?

    – halcón azul

    24 feb. 12 a las 11:04

  • Con mi programa, cambio el nombre de una imagen, luego, cuando intento abrir la imagen nuevamente (la misma aplicación, sin cerrarla), ya no reconoce la imagen. Sin embargo, después de un escaneo de medios, lo reconoce. Entonces, quiero escanear una ruta o un archivo, para que la aplicación reconozca el cambio de nombre.

    – Gran flujo

    24 feb. 12 a las 11:14

La historia

Antes de Android 4.4, podíamos simplemente enviar una transmisión para activar el escáner de medios en cualquier archivo o carpeta en particular o incluso en la raíz del almacenamiento. Pero a partir de 4.4 KitKat, esto ha sido solucionado por los desarrolladores de Android.

¿Por qué digo arreglado? La razón es simple. Enviar una transmisión usando MEDIA_MOUNTED en el directorio raíz es muy costoso. Ejecutar Media Scanner es una operación costosa y la situación empeora aún más cuando el usuario tiene muchos archivos en el almacenamiento y estructuras de carpetas profundas.

Antes de Android 4.4

Mantenlo directo y simple. Si está orientando su aplicación antes de Android 4.4. Pero tenga en cuenta que no debe usarlo en el directorio raíz a menos que sea absolutamente necesario.

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

Desde Android 4.4

Hay dos formas para ti.

i) El primero es muy similar al ejemplo anterior, pero puede no funcionar de manera eficiente y tampoco es recomendable.

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

ii) Ahora, pasemos a la solución más recomendada y eficiente para este problema.

Agregue las rutas de archivo de los archivos que se han actualizado, así, en un ArrayList de tipo String

ArrayList<String> toBeScanned = new ArrayList<String>();
toBeScanned.add(item.getFilePath());

Ahora debe ejecutar el método estático scanFile() de la clase MediaScannerConnection y pasar la matriz de cadenas que contiene la lista de todos los archivos que se han actualizado y deben escanearse los medios.

También puede poner un oyente para que responda cuando el escaneo haya terminado para archivos individuales.

String[] toBeScannedStr = new String[toBeScanned.size()];
                toBeScannedStr = toBeScanned.toArray(toBeScannedStr);

                MediaScannerConnection.scanFile(getActivity(), toBeScannedStr, null, new OnScanCompletedListener() {

                    @Override
                    public void onScanCompleted(String path, Uri uri) {
                        System.out.println("SCAN COMPLETED: " + path);

                    }
                });

  • way ii convierte directorios en archivos, consulte stackoverflow.com/questions/31157882/…

    – Un mundo

    01 jul.

  • way i no tiene ningún efecto (ambos comentarios se refieren a Android 5)

    – Un mundo

    01 jul.

  • Cuando copio un archivo a la carpeta Ringtones y dejo que Media Scanner lo escanee, ¡aparece de inmediato en el selector de sonido! Sin embargo, después de que mi aplicación elimine el archivo de la carpeta Ringtones, también dejo que el escáner de medios lo escanee (onScanCompleted() activa con uri = nulo), sin embargo, selector de medios aún muestra ese archivo. ¿Qué hacer después de eliminar el archivo para que el selector de medios ya no lo muestre?

    – Alguien en algún lugar

    21 dic. 15 a las 15:38

  • esta debería ser la respuesta más apropiada en lugar de la respuesta aceptada a continuación, ya que la respuesta aceptada no escanea en camino especifico+1

    – am05mhz

    25 jun.

  • ii) – no funcionó en Android 7, Nexus 5x: sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uriToMyDir)); La carpeta estaba en la raíz de la memoria interna. Solo ayudó el enfoque con scanFile.

    – Kirill Karmazin

    03 mar. 17 en 10:05


Oye, descubrí cómo hacerlo con un código muy simple.

Simplemente llame a esta línea de código:

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

Esto debería activar el escáner de medios.

  • Activará el escáner de medios pero escaneará todos los archivos (excepto aquellas carpetas con archivos .nomedia) en la tarjeta SD. Tomará tiempo escanear dependiendo del número de archivos en su tarjeta SD.

    – artylar

    16 abr.

  • Intent.ACTION_MEDIA_MOUNTED fallará en los dispositivos Android 4.4+ ya que la intención ahora se limita a las aplicaciones del sistema.

    – Nj Subedi

    17 ene.

  • Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED

    – Pratik Butani

    06 may. 2014 en 14:34

Activar el escaner de medios en una ruta especifica carpeta
halcón azul

En Android, hay una base de datos de contenido que utiliza el escáner multimedia para realizar un seguimiento de todo el contenido multimedia presente en el dispositivo.

Cuando se inicia Android, se inicia el servicio de escáner de medios y se ejecuta a través de todo el almacenamiento externo para encontrar si hay algún contenido multimedia nuevo si encuentra uno, entonces,

  • Agrega una entrada de ese contenido multimedia en la base de datos de contenido.
  • Cada entrada en la base de datos de contenido contiene metadatos del contenido multimedia como nombre, fecha, tamaño de archivo, tipo de archivo, etc.
  • Por lo tanto, cuando realice una modificación en un contenido multimedia, también deberá actualizar la base de datos de contenido.
  • Si la base de datos de contenido no se actualiza, otras aplicaciones tampoco podrán acceder a ese contenido multimedia en particular.
  • Ejecutar el escáner de medios solo actualiza la base de datos de contenido

En lugar de ejecutar el escáner de medios, puede actualizar la base de datos de contenido usted mismo y debería resolver el problema.

Aquí hay un explicación sobre cómo insertar, eliminar y actualizar utilizando el solucionador de contenido. (Busque la sección “Inserción, actualización y eliminación de datos”)

Editar:
Hay un código de muestra en esta respuesta. Compruebe la respuesta de Janusz.

  • Gracias, continuaré con eso cuando termine con algo más.

    – Gran flujo

    24 feb. 12 a las 14:02

  • Él, agregó mi propia respuesta, acaba de encontrar este código, aún más fácil de usar 🙂

    – Gran flujo

    27 feb.

private void galleryAddPic() {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}

Referencia: http://developer.android.com/training/camera/photobasics.html#TaskGallery

El Add the Photo to a Gallery Sección

  • Voy a romper en android 7.0

    – Vlado Pandzic

    07 jun.

Como respuesta de @Aritra Roy, decido hacer un experimento sobre este tema. Lo que tengo aquí son:

  • Intent.ACTION_MEDIA_MOUNTED e Intent.ACTION_MEDIA_SCANNER_SCAN_FILE pueden aceptar rutas de archivo individuales, por lo que sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(filePath))); o sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(filePath))); será válido.
  • Si usa una ruta de archivo individual con Intent.ACTION_MEDIA_MOUNTED en Kitkat o superior, su aplicación seguirá fallando
  • Si usa Intent.ACTION_MEDIA_SCANNER_SCAN_FILE o MediaScannerConnection en un dispositivo inferior a Kitkat, su aplicación no forzará el cierre, pero el método simplemente no funcionará como usted desea.

De ese experimento, creo que el mejor método para manejar es

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    MediaScannerConnection.scanFile(context, new String[]{imagePath}, null, new MediaScannerConnection.OnScanCompletedListener() {
        public void onScanCompleted(String path, Uri uri) {
            //something that you want to do
        }
    });
} else {
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
            Uri.parse("file://" + imagePath)));
}

Hazme saber si me perdí algo

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad