Подтвердить что ты не робот

Невозможно увидеть файл в Windows, написанный приложением Android на SD-карте, пока я не "принудительно закрою" приложение

Я написал файл через мою программу для Android следующим образом:

String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(str + "\n");     \\ Yeah, 'str' has a value there
writer.close();

Программа делает свою работу, и она заканчивается. Теперь я нажимаю кнопку "Назад" на Android, чтобы закрыть приложение. Если я затем захожу в файловый браузер Android (например, Astro), я вижу файл, но если я монтирую SD-карту в Windows, я не вижу файл!

Теперь, если я зайду в Настройки → Приложения → Управление приложениями → "Принудительная остановка" <приложение>, я смогу увидеть файл даже в Windows.

Что я должен сделать, чтобы я мог видеть файл в Windows, если файл записан моим приложением для Android на SD-карте, и я не хочу заходить в настройки и каждый раз нажимать принудительно.

На самом деле файл пишется правильно (я думаю), но так как поведение кнопки "назад" в Android по умолчанию не убивает приложение, и похоже, что если приложение не убито, я не могу открыть файл за пределами Android (в Андроид, я все еще могу его увидеть и даже открыть).

Итак, что будет лучшим решением для этого случая? Должен ли я автоматически убить приложение, когда оно закрывается? Люди говорят, что System.exit() строго не рекомендуется.

4b9b3361

Ответ 1

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

У вас есть две возможности:

  1. Это быстрее, потому что Android обновляет только переданный файл:

    MediaScannerConnection.scanFile(this, new String[]{"your path here</"}, null, null);

  2. Это дороже, потому что Android будет искать все файлы по пройденному пути. Вы можете передать только путь к папке, чтобы уменьшить поиск файлов:

    context.sendBroadcast(
        new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                   Uri.parse("file://" + "path of the folder")));
    

Ответ 2

Поскольку объект BufferedWriter является буфером, вам нужно сбросить() буфер, чтобы заставить контент быть записанным в выходной поток.

String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(file));   
writer.write(str+"\n");
writer.flush(); // force the buffer to actually dump its data to the stream
writer.close();

Когда вы используете .write() с помощью буфера, всегда помните, что данные будут храниться в буфере до тех пор, пока не будет заполнен буфер (а затем автоматически отключен() ed) или вы заставите буфер сбросить свои данные с помощью .flush() буфера.

Кроме того, причина, по которой файл не был написан правильно, до тех пор, пока вы принудительно закрыли приложение, связано с тем, что когда вы убиваете приложение, один из шагов: сбросить() все буферы, связанные с приложением. Вот почему это произошло только тогда, когда вы силой убили его.

Примечание: Имейте в виду, что это поведение по умолчанию большинства типов буферизованных потоков на разных языках.

Ответ 3

Windows 7 действительно имела проблемы с просмотром файлов при подключении через USB-соединение. Обходным путем для меня было использование дистрибутива GNU/Linux.

Используя терминальное приложение, есть разница, где root:root файлы доступны для просмотра в Проводнике, но других владельцев нет.