Android,如何防止卸载应用时删除内部存储文件
Android, how to prevent internal storage files to be deleted when the app is uninstalled
我正在开发一个应用程序,它将一些设置存储在两个 .xml 文件中,并保存在内部存储器中。我需要把它们保存在那里,所以请不要回答我"Save them on SD-cards"。
我尝试卸载然后重新安装(从 Android Studio)我的应用程序以查看 android:allowBackup="true"
是否也适用于内部存储文件,但答案是否定的。
这是因为我从 IDE 重新安装还是我需要在某处添加一些代码?
感谢您的帮助。
您可以使用 Environment.getExternalStorageDirectory()
保存这些文件 这存储在外部存储设备上。不要将术语外部存储与 SD 卡混淆。 SD 卡是辅助外部存储。但是 Environment.getExternalStorageDirectory()
returns top-level 您设备的主要外部存储目录,基本上是不可移动存储。
所以文件路径可以是/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”清单标志
If true the user is prompted to keep the app's data on uninstall.
May be a boolean value, such as "true" or "false".
示例代码:
<application
....
android:hasFragileUserData="true">
我正在开发一个应用程序,它将一些设置存储在两个 .xml 文件中,并保存在内部存储器中。我需要把它们保存在那里,所以请不要回答我"Save them on SD-cards"。
我尝试卸载然后重新安装(从 Android Studio)我的应用程序以查看 android:allowBackup="true"
是否也适用于内部存储文件,但答案是否定的。
这是因为我从 IDE 重新安装还是我需要在某处添加一些代码?
感谢您的帮助。
您可以使用 Environment.getExternalStorageDirectory()
保存这些文件 这存储在外部存储设备上。不要将术语外部存储与 SD 卡混淆。 SD 卡是辅助外部存储。但是 Environment.getExternalStorageDirectory()
returns top-level 您设备的主要外部存储目录,基本上是不可移动存储。
所以文件路径可以是/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”清单标志
If true the user is prompted to keep the app's data on uninstall. May be a boolean value, such as "true" or "false".
示例代码:
<application
....
android:hasFragileUserData="true">