【发布时间】:2023-02-14 21:50:07
【问题描述】:
我创建了一个应用程序,可以从谷歌驱动器下载加密文件并将其存储在设备下载文件夹中。然后它解密(使用 aes_crypt_null_safe 包)该文件并将其存储为纯文本文件。下面是两个函数。
从驱动器下载
Future<void> downloadFromDrive(String fName, String gdID) async {
var client = GoogleAuthClient(authHeaders);
var ga = drive.DriveApi(client);
drive.Media file = await ga.files
.get(gdID, downloadOptions: drive.DownloadOptions.fullMedia) as Media;
print(file.stream);
final directory = await getExternalStorageDirectory();
print(directory?.path);
final saveFile =
File('/storage/emulated/0/Download/test_gdrive_download.txt.aes');
List<int> dataStore = [];
file.stream.listen((data) {
print("DataReceived: ${data.length}");
dataStore.insertAll(dataStore.length, data);
}, onDone: () async {
print("Task Done");
await saveFile.writeAsBytes(dataStore);
print("File saved at ${saveFile.path}");
}, onError: (error) {
print("Some Error");
});
await Future.delayed(const Duration(seconds: 3), () {
});
}
解密
decryptJsonFile({required String srcPath, required String destPath}) async {
crypt.decryptFileSync(srcPath, destPath);
}
调用两个函数
onPressed: () async {
print("Downloading file from drive...");
await downloadFromDrive("ideas", fileId.toString());
print("Decrypting the file downloaded from drive...");
await decryptJsonFile(
srcPath: '/storage/emulated/0/Download/test_gdrive_download.txt.aes',
destPath: '/storage/emulated/0/Download/decrypted_file.txt');
},
当我尝试触发这些功能时,它会完美下载文件并将其存储在下载文件夹中,但是当我尝试解密时出现以下错误,
[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: FileSystemException: Failed to open /storage/emulated/0/Download/test_gdrive_download.txt.aes for writing., path = '/storage/emulated/0/Download/decrypted_file.txt' (OS Error: Permission denied, errno = 13)
我已经在我的 android 清单文件中提供了所有必需的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
和
android:requestLegacyExternalStorage="true"
【问题讨论】:
-
您需要向用户询问存储访问权限以允许访问存储读写
标签: flutter dart android-external-storage