我正在尝试将excel文件保存到本地存储中,但在创建该文件时会遇到此错误。我在用物理设备调试。只有当设备有外部SD卡并配置为内部存储时,它才能工作。但是,当我在另一个设备(物理设备)上运行带有SD卡(配置为便携存储)的应用程序时,它不起作用,我得到了下面的错误。
误差
[ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: FileSystemException: Creation failed, path = '/storage/emulated/0/Traders' (OS Error: Operation not permitted, errno = 1)
E/flutter (15532): #0 _Directory.create.<anonymous closure> (dart:io/directory_impl.dart:117:11)
E/flutter (15532): #1 _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (15532): #2 _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (15532): #3 _FutureListener.handleValue (dart:async/future_impl.dart:152:18)
E/flutter (15532): #4 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:704:45)
E/flutter (15532): #5 Future._propagateToListeners (dart:async/future_impl.dart:733:32)
E/flutter (15532): #6 Future._completeWithValue (dart:async/future_impl.dart:539:5)
E/flutter (15532): #7 Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:577:7)
E/flutter (15532): #8 _rootRun (dart:async/zone.dart:1354:13)
E/flutter (15532): #9 _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter (15532): #10 _CustomZone.runGuarded (dart:async/zone.dart:1162:7)
E/flutter (15532): #11 _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1202:23)
E/flutter (15532): #12 _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
E/flutter (15532): #13 _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
E/flutter (15532):
我的代码
import 'dart:io' as IO;
IO.Directory dir = await getExternalStorageDirectory();
String outputFile = "report"+DateFormat('dd-MM-yyyy hh:mm:ss').format(DateTime.now())+".xls";
if (await Permission.storage.request().isGranted) {
if (!IO.Directory('${dir.parent.parent.parent.parent.parent.path}/Traders/Reports').existsSync())
await IO.Directory('${dir.parent.parent.parent.parent.path}/Traders/Reports').create(recursive: true);
final file = IO.File(join('${dir.parent.parent.parent.parent.path}/Traders/Reports',outputFile));
await file.writeAsBytes(excel.encode()).then((value) {
if(IO.Platform.isAndroid||IO.Platform.isIOS)
OpenFile.open('${dir.parent.parent.parent.parent.path}/Traders/Reports/$outputFile');
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("File Saved !")));
}).catchError((e){
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Error Saving File !")));
});
}else{
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Error:Permission denied.Grant storage permission to save file."),action: SnackBarAction(label: 'Grant',onPressed: ()async{
await Permission.storage.request();
},),));
}
AndroidMalifest.xml
<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"/>
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
发布于 2021-04-18 10:00:32
阿博维柯很乱。您可以使用这个包直接获取Home路径。(/storage/emulated/0
)
然后你就可以简单地做这个
var path = await ExtStorage.getExternalStorageDirectory();
final file = await File(path+'/Traders/Report').create(recursive: true);
file.writeAsStringSync("Hello I'm writting a stackoverflow answer into you");
或
这个包不是空安全的。所以在这种情况下我提供了本地代码。
一些省道文件,您需要路径
exportPath = await channel.invokeMethod('getExternalStorageDirectory'); // Call native code like this in your dart file
然后实现这个
转到‘android-> app ->src->main->kotlin->.您的应用程序名->MainActivity.kt’。
Add this
class MainActivity : FlutterFragmentActivity() {
private val channel = "externalStorage";
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel).setMethodCallHandler { call, result ->
when (call.method) {
"getExternalStorageDirectory" ->
result.success(Environment.getExternalStorageDirectory().toString())
"getExternalStoragePublicDirectory" -> {
val type = call.argument<String>("type")
result.success(Environment.getExternalStoragePublicDirectory(type).toString())
}
else -> result.notImplemented()
}
}
}
}
https://stackoverflow.com/questions/67151331
复制相似问题