Создание файла в внутренней памяти

120
08 июля 2021, 04:00

Задача следующая - нужно создать файл во внутренней памяти телефона. Причем не в /data/user/..., а в определенном каталоге - "*память телефона*/Documents/file.txt" и записать туда текст из TextBox.

В моей процедуре ошибки нет, запись из textBox в файл я делаю, только сам файл нигде не наблюдаю.Я не знаю как здесь - fos = openFileOutput( FILE_NAME, MODE_PRIVATE); указать, что нужно выполнить запись в каталог - "*память телефона/Documents/ в файл FILE_NAME (значение FILE_NAME = "file.txt"). Прошу помочь. Благодарю!

P.S. Прочитал очень много похожих тем, в том числе и на stackoverflow - ответа не нашел. В манифесте все permissions для internal st указаны.

public void saveText(View view) {
    FileOutputStream fos = null;
    File file = new File("/Documents", FILE_NAME);
    try
    {
        EditText textBox = (EditText) findViewById(id.save_text);
        String text = textBox.getText().toString();
        fos = openFileOutput( file.toString(), MODE_PRIVATE);
        fos.write(text.getBytes());
        //String path = file.getAbsolutePath();
        Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show();
    } catch (IOException ex) {
        Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
    } finally {
        try {
            if (fos != null)
                fos.close();
        } catch (IOException ex) {
            Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
}
Answer 1

Вполне вероятно, что на доступ к внешней памяти у Вашего приложения просто нет прав.

Укажите в манифесте права:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Если предполагается работа на Android 6 и выше, после этого перед сохранением в файл вызывайте стандартную проверку:

if ((checkSelfPermission(
                (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
                && (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)                
        ) {
            String[] perm = new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,                
                Manifest.permission.READ_EXTERNAL_STORAGE                
        };
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(perm, REQUEST_ID_IMAGE_CAPTURE);
        }
        }

Также было бы не плохо проверить сам факт создания файла и папки, в которой он находится через exists и если их нет создать.

File f = new File(path);
f.getParentFile().mkdirs(); 
f.createNewFile();
Answer 2

Всё! Решил. Код прилагаю:

   public void saveNote (View view) throws IOException {
        String fN = FILE_NAME;
        EditText textBox = (EditText) findViewById (id.save_text); // содержимое файла
        requestPerms();
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            //Log.d(LOG_TAG, "Каталог не доступен: " + Environment.getExternalStorageState());
            Toast.makeText(this, "Каталог не доступен: " + Environment.getExternalStorageState(), Toast.LENGTH_SHORT).show();
            return;
        }
        // получаем путь к SD
        File sPath = Environment.getExternalStorageDirectory();
        // добавляем свой каталог к пути
        sPath = new File(sPath.getAbsolutePath() + "/"+ DIR_SD);
        if (!sPath.exists())
            sPath.mkdir();
        // формируем объект File, который содержит путь к файлу
        File sFile = new File(sPath, fN);
        try {
            FileWriter f = new FileWriter(sFile);
            f.write(textBox.getText().toString());
            // закрываем поток
            f.close();
            //Log.d(LOG_TAG, "Файл записан на SD: " + sdFile.getAbsolutePath());
            Toast.makeText(this, "Файл сохранен"+ sFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
private void requestPerms(){
    String[] perm = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        ActivityCompat.requestPermissions(MainActivity.this,perm,123);
    }
}
READ ALSO
Инжект полей без конструктора c Dagger 2

Инжект полей без конструктора c Dagger 2

На сайте с документации к Dagger 2 есть следующий пример кода и слова:

89
вопрос про массивов

вопрос про массивов

В одном тесте я встретил пункты

83
Как готовиться к собеседованию на позицию java middle? [закрыт]

Как готовиться к собеседованию на позицию java middle? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

115