¿Cómo escribir archivos en un almacenamiento público externo en Android para que sean visibles desde Windows?
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):
Este es el directorio en el que se escribe el archivo (usando la implementación anterior):
¿Qué hay de malo en mi implementación?
¿Qué hay de malo en mi implementación?
MediaStore
aú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 MediaStore
se ha indexado.
Utilice MediaScannerConnection
y su scanFile()
método para informarle MediaStore
sobre 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)
}