use*_*079 3 android dart flutter
对 Flutter 来说相当新,所以这个问题可能听起来很明显,但是嘿\xe2\x80\xa6 我正在尝试使用 flutter_email_sender ( https://pub.dartlang.org/packages/flutter_email_sender ) 包将 .csv 文件附加到电子邮件。这是我的代码:
\n Future<String> get _localPath async {\n final directory = await getApplicationDocumentsDirectory();\n\n return directory.absolute.path;\n }\n\n Future<int> export(String csv) {\n final String path = await _localPath + "/" + file_name;\n File file = File(path);\n file.writeAsString(csv);\n\n File readFile = File(path);\n print("content: ${await readFile.readAsString()}");\n // the two lines above print the content of the file, as expected\n\n final Email email = Email(\n body: \'blah blah\',\n subject: \'blah blaaaah\',\n recipients: ["a@a.com"],\n attachmentPaths: [file.path],\n );\n\n String platformResponse;\n\n try {\n print("Trying to send email.");\n await FlutterEmailSender.send(email);\n platformResponse = \'success\';\n } catch (error) {\n print("Error");\n print(error);\n platformResponse = error.toString();\n }\n\n return platformResponse;\n }\nRun Code Online (Sandbox Code Playgroud)\n和堆栈跟踪:
\nE/MethodChannel#flutter_email_sender( 3433): Failed to handle method call\nE/MethodChannel#flutter_email_sender( 3433): java.lang.IllegalArgumentException: Failed to find configured root that contains /data/package.name/app_flutter/fileName.csv\nE/MethodChannel#flutter_email_sender( 3433): at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:744)\nE/MethodChannel#flutter_email_sender( 3433): at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)\nE/MethodChannel#flutter_email_sender( 3433): at com.sidlatau.flutteremailsender.FlutterEmailSenderPlugin.sendEmail(FlutterEmailSenderPlugin.kt:102)\nE/MethodChannel#flutter_email_sender( 3433): at com.sidlatau.flutteremailsender.FlutterEmailSenderPlugin.onMethodCall(FlutterEmailSenderPlugin.kt:41)\nE/MethodChannel#flutter_email_sender( 3433): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:230)\nE/MethodChannel#flutter_email_sender( 3433): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)\nE/MethodChannel#flutter_email_sender( 3433): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:683)\nE/MethodChannel#flutter_email_sender( 3433): at android.os.MessageQueue.nativePollOnce(Native Method)\nE/MethodChannel#flutter_email_sender( 3433): at android.os.MessageQueue.next(MessageQueue.java:326)\nE/MethodChannel#flutter_email_sender( 3433): at android.os.Looper.loop(Looper.java:160)\nE/MethodChannel#flutter_email_sender( 3433): at android.app.ActivityThread.main(ActivityThread.java:6863)\nE/MethodChannel#flutter_email_sender( 3433): at java.lang.reflect.Method.invoke(Native Method)\nE/MethodChannel#flutter_email_sender( 3433): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)\nE/MethodChannel#flutter_email_sender( 3433): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\nI/flutter ( 3433): Error\nI/flutter ( 3433): PlatformException(error, Failed to find configured root that contains /data/data/package.name/app_flutter/fileName.csv, null)\nRun Code Online (Sandbox Code Playgroud)\n请注意,“/data”在上面显示的错误消息的路径中出现了两次。我也尝试过手动设置路径来删除多余的路径,但无济于事。
\n预先感谢您的帮助 :)
\n小智 14
在:
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.absolute.path;
}
Run Code Online (Sandbox Code Playgroud)
你应该使用:
Future<String> get _localPath async {
final directory = await getExternalStorageDirectory();
return directory.absolute.path;
}
Run Code Online (Sandbox Code Playgroud)
我的理解如下,您可以在ApplicationDocumentsDirectory中读写,但无法在应用程序外部访问数据。由于当您调用 FlutterEmailSender 时,数据会通过其他应用程序发送,因此您必须将 .csv 保存到“公共”位置。如果您确实希望数据位于应用程序文档目录中,我鼓励您进一步调查https://developer.android.com/reference/androidx/core/content/FileProvider 但您可能需要编写一些平台特定代码。
问候
小智 8
我不知道您是否已经找到了解决方案,但无论如何我都会留下我的解决方案来帮助其他开发人员!
首先,在/android/app/src/main/AndroidManifest.xml中,配置以下内容:
(...)
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.com.shekarmudaliyar.social_share"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
(...)
<application>
Run Code Online (Sandbox Code Playgroud)
-然后,在名为 xml 的文件夹内创建 filepaths.xml 文件,该文件必须在以下路径中创建:/android/app/src/main/res/xml,包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<root-path name="root" path="." />
<external-path name="external" path="." />
<external-files-path name="external_files" path="." />
<cache-path name="cache" path="." />
<external-cache-path name="external_cache" path="." />
<files-path name="files" path="." />
</paths>
Run Code Online (Sandbox Code Playgroud)
这应该足以阻止错误。
| 归档时间: |
|
| 查看次数: |
6356 次 |
| 最近记录: |