Как записать файлы на внешнее общедоступное хранилище на Android, чтобы они были видны из Windows?

Мое приложение должно сохранять файлы в том месте, где при подключении вашего телефона/планшета к компьютеру вы можете просмотреть их через проводник системных файлов.

Так я реализовал запись файла:

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

Это то, что я вижу, когда подключаю планшет Sony Xperia Z4 к Windows (обратите внимание на папку с отсутствующими документами):

просмотрщик файлов Windows, отображающий содержимое планшета

Это каталог, в который записывается файл (с использованием вышеприведенной реализации):

монитор устройства Android с файловой системой

Что не так с моей реализацией?

Ответ 1

  Что не так с моей реализацией?

MediaStore еще не обнаружил ваши вновь созданные файлы. Что вы видите в Windows &— и во многих приложениях "галереи" на устройстве - &— основан на том, что индексирует MediaStore.

Используйте MediaScannerConnection и его метод scanFile(), чтобы сообщить MediaStore о вашем файле, как только вы записали свои данные на диск:

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

или в Котлине:

fun scanFile(ctxt: Context, f: File, mimeType: String) {
  MediaScannerConnection.scanFile(ctxt, arrayOf(f.getAbsolutePath()), arrayOf(mimeType), null)
}