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">
Другие вопросы по тегам