¿Cómo escribir archivos en un almacenamiento público externo en Android para que sean visibles desde Windows?

Resuelto transporter_room_3 asked hace 54 años • 1 respuestas

Mi aplicación debería guardar archivos en un lugar donde, cuando conecte su teléfono/tableta a una computadora, pueda verlos a través del explorador de archivos del sistema.

Esta es la forma en que implementé la escritura de archivos:

protected String mDir = Environment.DIRECTORY_DOCUMENTS;
protected File mPath = Environment.getExternalStoragePublicDirectory(mDir);

protected void writeLogFile(String filename) {
    File f = new File(mPath, filename + ".txt");
    f.getParentFile().mkdirs();
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(f, false))) {

        // Details omitted.

    } catch (Exception e) {
        e.printStackTrace();
        return;
    }
    makeText("Wrote " + f.getAbsolutePath());
}

Esto es lo que veo cuando conecto mi tableta Sony Xperia Z4 a Windows (observe que falta la carpeta de documentos):

Explorador de archivos de Windows que muestra el contenido de la tableta.

Este es el directorio en el que se escribe el archivo (usando la implementación anterior):

Monitor de dispositivo Android que muestra el sistema de archivos.

¿Qué hay de malo en mi implementación?

transporter_room_3 avatar Jan 01 '70 08:01 transporter_room_3
Aceptado

¿Qué hay de malo en mi implementación?

MediaStoreaún no ha descubierto sus archivos recién creados. Lo que ves en Windows (y en muchas aplicaciones de "galería" del dispositivo) se basa en lo que MediaStorese ha indexado.

Utilice MediaScannerConnectiony su scanFile()método para informarle MediaStoresobre su archivo, una vez que haya escrito sus datos en el disco:

public void scanFile(Context ctxt, File f, String mimeType) {
    MediaScannerConnection
        .scanFile(ctxt, new String[] {f.getAbsolutePath()},
                  new String[] {mimeType}, null);
}

o, en Kotlin:

fun scanFile(ctxt: Context, f: File, mimeType: String) {
  MediaScannerConnection.scanFile(ctxt, arrayOf(f.getAbsolutePath()), arrayOf(mimeType), null)
}
CommonsWare avatar Sep 25 '2015 19:09 CommonsWare