Flutter:PlatformException(错误,无法找到包含 <path> 的已配置根,null)

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    }\n
Run Code Online (Sandbox Code Playgroud)\n

和堆栈跟踪:

\n
E/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)\n
Run 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)

这应该足以阻止错误。