Android, как предотвратить удаление файлов внутреннего хранилища при удалении приложения
Я разрабатываю приложение, которое хранит несколько настроек в двух XML-файлах, сохраненных во внутренней памяти. Мне нужно сохранить их там, поэтому, пожалуйста, не отвечайте мне "Сохраните их на SD-картах".
Я пытаюсь удалить и переустановить (из Android Studio) мое приложение, чтобы увидеть, android:allowBackup="true"
работает также для внутреннего хранимого файла, но ответ был нет.
Это потому, что я сделал переустановку из IDE или мне нужно добавить код куда-нибудь?
Спасибо за помощь.
2 ответа
Вы можете сохранить эти файлы, используя Environment.getExternalStorageDirectory()
Это хранится на внешнем запоминающем устройстве. Не путайте термин внешнее хранилище как SD-карта. SD-карта является вторичным внешним хранилищем. Но Environment.getExternalStorageDirectory()
возвращает каталог верхнего уровня основного внешнего хранилища вашего устройства, которое в основном является несъемным хранилищем.
Таким образом, путь к файлу может быть /storage/emulated/0/YOURFOLDER/my.xml
Таким образом, даже если вы удалите приложение, эти файлы не будут удалены.
Вы можете использовать этот фрагмент для создания файла в вашем основном внешнем хранилище:
private final String fileName = "note.txt";
private void writeFile() {
File extStore = Environment.getExternalStorageDirectory();
// ==> /storage/emulated/0/note.txt
String path = extStore.getAbsolutePath() + "/" + fileName;
Log.i("ExternalStorageDemo", "Save to: " + path);
String data = editText.getText().toString();
try {
File myFile = new File(path);
myFile.createNewFile();
FileOutputStream fOut = new FileOutputStream(myFile);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(data);
myOutWriter.close();
fOut.close();
Toast.makeText(getApplicationContext(), fileName + " saved", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
Не забудьте добавить разрешение ниже в Android Manifest
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Затем вы можете прочитать этот файл, как показано ниже:
private void readFile() {
File extStore = Environment.getExternalStorageDirectory();
// ==> /storage/emulated/0/note.txt
String path = extStore.getAbsolutePath() + "/" + fileName;
Log.i("ExternalStorageDemo", "Read file: " + path);
String s = "";
String fileContent = "";
try {
File myFile = new File(path);
FileInputStream fIn = new FileInputStream(myFile);
BufferedReader myReader = new BufferedReader(
new InputStreamReader(fIn));
while ((s = myReader.readLine()) != null) {
fileContent += s + "\n";
}
myReader.close();
this.textView.setText(fileContent);
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), fileContent, Toast.LENGTH_LONG).show();
}
Начиная с уровня API 29 есть флаг манифеста hasFragileUserData.
В документации указано, что
Если true, пользователю предлагается сохранить данные приложения при удалении. Может быть логическим значением, например «истина» или «ложь».
Образец кода:
<application
....
android:hasFragileUserData="true">