Написанное приложение не сохраняет текстовые файлы (android, java)
Не могу найти ошибку. Приложение должно сохранять текстовые файлы, но после нажатия на кнопку и ввода имени ничего не происходит (хотя должно выскочить уведомление о том, что файл был/не был сохранен)
IDE подсвечивает root.mkdirs(); как игнорируемое, но программа работает
public String filename = null;
private String path = Environment.getExternalStorageDirectory().toString() + "/files/";
прочие варианты case убраны для краткости (но они работают верно)
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_save:
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle("Имя файла");
alertDialog.setMessage("Введите имя файла:");
final EditText input_save = new EditText(this);
alertDialog.setView(input_save);
alertDialog.setPositiveButton("Сохранить", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String value = input_save.getText().toString();
filename = value + ".txt";
saveFile(filename, editText.getText().toString());
}
});
alertDialog.setNegativeButton("Отмена", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "Не сохранено", Toast.LENGTH_SHORT).show();
}
});
alertDialog.show();
return true;
}
}
private void saveFile(String filename, String body) {
try {
File root = new File(this.path);
if (!root.exists()) {
root.mkdirs();
}
else {
Toast.makeText(MainActivity.this, "Не сохранено!", Toast.LENGTH_SHORT).show();
}
File file = new File(root, filename);
FileWriter writer = new FileWriter(file);
writer.append(body);
writer.flush();
writer.close();
Toast.makeText(MainActivity.this, "Сохранено!", Toast.LENGTH_SHORT).show();
}catch (Exception e) {
e.printStackTrace();
}
}```
Ответы (2 шт):
И не будет сохранять. Потому что вы полностью игнорируете ограничения на доступ к файловой системе введенные в т.н. Scoped Storage.
Наиболее бескровный выход из ситуации в вашем случае, это сохранение во внутреннее хранилище вашего приложения, который можно получить через context.getFilesDir(), правда файл/раздел будет недоступен для других приложений :) - что видимо не входит в ваши планы.
Подробная (более-менее) процедура записи во внешний файл в рамках Scoped Storage описана здесь
похоже, что Вы пытаетесь создать в файл в контексте, который для этого не предназначен. Попробуйте исправить ваш код на следующий:
принимайте в методе еще и контекст.
блок с проверкой "создана папка?" можно удалить. сразу напрямую идите к корневой папке используя все тот же контекст.
private void saveFile(AppCompatActivity app, String filename, String body) {
try{
File file = new File(app.getFilesDir, filename);
FileWriter writer = new FileWriter(file);
writer.append(body);
writer.flush();
writer.close();
Toast.makeText(MainActivity.this, "Сохранено!", Toast.LENGTH_SHORT).show();
}catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "НЕ Сохранено!", Toast.LENGTH_SHORT).show();
}
}
ну а когда вызываете этот метод, передавайте текущей контекст Активити:
saveFile(this, filename, editText.getText().toString());