У меня странная проблема, с которой я столкнулся. Мое приложение может писать простой текстовый файл на SD-карту, и иногда это работает для некоторых людей, но не для других, и я понятия не имею, почему.
Для некоторых людей это принудительно закрывается, если они помещают в файл такие символы, как ...
и т.д. Я не могу воспроизвести его, поскольку у меня не было проблем, но это код, который обрабатывает запись файла. Может ли кто-нибудь подумать о чем-то, что может привести к проблемам или к лучшему пути к этому?
public void generateNoteOnSD(String sFileName, String sBody)
{
try
{
File root = new File(Environment.getExternalStorageDirectory(), "Notes");
if (!root.exists())
{
root.mkdirs();
}
File gpxfile = new File(root, sFileName);
FileWriter writer = new FileWriter(gpxfile);
writer.append(sBody);
writer.flush();
writer.close();
Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
}
catch(IOException e)
{
e.printStackTrace();
importError = e.getMessage();
iError();
}
}
Ответ 1
Этот метод можно использовать для проверки состояния sdCard. Измените диалог тоста на язык:
** Уход за MEDIA_MOUNTED_READ_ONLY. Не нужно писать в SDCard и я возвращаю true **
public static Boolean comprobarSDCard(Context mContext) {
String auxSDCardStatus = Environment.getExternalStorageState();
if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED))
return true;
else if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
Toast.makeText(
mContext,
"Warning, the SDCard it only in read mode.\nthis does not result in malfunction"
+ " of the read aplication", Toast.LENGTH_LONG)
.show();
return true;
} else if (auxSDCardStatus.equals(Environment.MEDIA_NOFS)) {
Toast.makeText(
mContext,
"Error, the SDCard can be used, it has not a corret format or "
+ "is not formated.", Toast.LENGTH_LONG)
.show();
return false;
} else if (auxSDCardStatus.equals(Environment.MEDIA_REMOVED)) {
Toast.makeText(
mContext,
"Error, the SDCard is not found, to use the reader you need "
+ "insert a SDCard on the device.",
Toast.LENGTH_LONG).show();
return false;
} else if (auxSDCardStatus.equals(Environment.MEDIA_SHARED)) {
Toast.makeText(
mContext,
"Error, the SDCard is not mounted beacuse is using "
+ "connected by USB. Plug out and try again.",
Toast.LENGTH_LONG).show();
return false;
} else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTABLE)) {
Toast.makeText(
mContext,
"Error, the SDCard cant be mounted.\nThe may be happend when the SDCard is corrupted "
+ "or crashed.", Toast.LENGTH_LONG).show();
return false;
} else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTED)) {
Toast.makeText(
mContext,
"Error, the SDCArd is on the device but is not mounted."
+ "Mount it before use the app.",
Toast.LENGTH_LONG).show();
return false;
}
return true;
}
Ответ 2
Проверяете ли вы, что внешнее хранилище можно записать? Если нет, попробуйте использовать...
Environment.getExternalStorageState()
Это скажет вам, смонтирована ли SD-карта, и вы также можете проверить, можно ли ее записать. Это все, что я могу предложить предложить на этом этапе.
Ответ 3
Я только узнал, что в моем случае мне не удалось добавить <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
в файл манифеста.
Приветствия,
Вахиб
Ответ 4
Для всех коллег-новичков там отладка на самом устройстве через USB: не забудьте отключить USB-кабель от вашего компьютера-разработчика, как и я. Когда USB подключен, SD-карта недоступна. Счастливое письмо...
Это неверно на всех сборках телефонов/ПЗУ. CMod7 и MIUI ROMS позволяют вам установить, смонтирована ли SD-карта или нет, когда она подключена к ПК, в зависимости от ваших настроек, это может быть правдой. Лучше всего проверить.
Ответ 5
Я обычно использую PrintWriter, а не FileWriter. Я не знаю, решит ли он вашу проблему, но на более высоком уровне, чтобы он мог позаботиться о чем-то другом, кроме простого FileWriter.