Задача следующая - нужно создать файл во внутренней памяти телефона.
Причем не в /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();
}
}
}
Вполне вероятно, что на доступ к внешней памяти у Вашего приложения просто нет прав.
Укажите в манифесте права:
<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();
Всё! Решил. Код прилагаю:
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);
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
На сайте с документации к Dagger 2 есть следующий пример кода и слова:
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах