Написанное приложение не сохраняет текстовые файлы (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 шт):

Автор решения: Barmaley

И не будет сохранять. Потому что вы полностью игнорируете ограничения на доступ к файловой системе введенные в т.н. Scoped Storage.

Наиболее бескровный выход из ситуации в вашем случае, это сохранение во внутреннее хранилище вашего приложения, который можно получить через context.getFilesDir(), правда файл/раздел будет недоступен для других приложений :) - что видимо не входит в ваши планы.

Подробная (более-менее) процедура записи во внешний файл в рамках Scoped Storage описана здесь

→ Ссылка
Автор решения: Wlad

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

принимайте в методе еще и контекст.
блок с проверкой "создана папка?" можно удалить. сразу напрямую идите к корневой папке используя все тот же контекст.

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());
→ Ссылка