为什么我无法复制/删除使用 flutter 创建的文件?

问题描述 投票:0回答:1

使用 flutter 应用程序,我在“storage/emulated/0/Documents/Keep/cs.db”路径中创建了一个数据库文件。我删除了该应用程序。我再次安装了该应用程序并想要删除/复制我创建的文件。但现在我无法对该文件执行任何操作。为什么?

我拥有所需的权限:

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

我还添加了 android:requestLegacyExternalStorage="true" 。

我正在执行以下操作来删除该文件:

File oldBackup = File(destinationPath);
print(await oldBackup.exists());
oldBackup.deleteSync();
print(await File(destinationPath).exists());

等待oldBackuo.exists()返回true,

但是 oldBackup.deleteSync() 和 oldBackup.delete() 返回“PathNotFoundException:无法删除文件,路径 = 'storage/emulated/0/Documents/Keep/cs.db'(操作系统错误:没有这样的文件或目录,errno = 2)”

如何?当我第二次安装该应用程序时,如何删除/复制该文件?

android flutter android-file flutter-file
1个回答
0
投票

其 Android 安全功能可隔离应用程序访问手机内存的特定部分。通过这样做,系统确保每个应用程序都可以处理或使用自己的数据库,并提高应用程序的安全性。默认情况下,您的应用程序只能使用其内部存储文件夹,而没有机会访问像这样的任何外部存储源

/存储/模拟/0/文档

Android 11 不允许直接访问存储中的文件,您必须将该文件放入您的应用程序包(例如:com.example.yourpackage)缓存中。


解决方案:

1。内部存储:

将数据文件(例如cs.db)保存到应用程序的内部存储目录中,就像应用程序安装或用户操作一样。这使应用程序保持在持久状态。但是,它会在卸载应用程序时被删除。

2。资产:

相反,cs.db 文件可能位于项目的 asset 文件夹中。

通过 Activity 类从项目的资产文件夹中打开文件并立即读取其中存储的数据。然而,这对于无法修改的静态数据来说可能是最好的。

确保选择符合应用程序数据细节和使用方式的策略。

3.共享首选项:

SharedPreferences是Android平台提供的轻量级数据存储工具。它不仅非常适合保留少量的键值对,您应该能够在应用程序会话中甚至在设备重新启动后重复使用这些键值对,而且它还可以确保您的所有数据都是安全且恒定的。


考虑阅读

Android 文档 - https://developer.android.com/about/versions/11/privacy/storage

Google Play 指南 - https://developer.android.com/training/data-storage/manage-all-files#all-files-access-google-play

© www.soinside.com 2019 - 2024. All rights reserved.