🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

2095閲覧

FlutterでAndroid実機のcurrent directoryが取得できません

odekakeneko

総合スコア11

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2019/11/17 08:25

前提・実現したいこと

FlutterでAndroid実機を用いて、CSVファイルを生成、メールで添付して送るコードを作っております。
その際に、Android実機のcurrentなDirectoryにcsvファイルを吐き出すことになるのですが、
これがどうもうまくいっていない様子です。

Windows10で下記関数を実行するとちゃんとCSVファイルが生成されるのですが、
Android実機だとうまくいかず、その理由と解決方法がわかれば幸いです。

発生している問題・エラーメッセージ

E/MethodChannel#flutter_mailer(17274): Failed to handle method call E/MethodChannel#flutter_mailer(17274): java.lang.IllegalArgumentException: Failed to find configured root that contains /sample.csv E/MethodChannel#flutter_mailer(17274): at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:739) E/MethodChannel#flutter_mailer(17274): at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418) E/MethodChannel#flutter_mailer(17274): at com.dataxad.fluttermailer.FlutterMailerPlugin.mail(FlutterMailerPlugin.java:116) E/MethodChannel#flutter_mailer(17274): at com.dataxad.fluttermailer.FlutterMailerPlugin.onMethodCall(FlutterMailerPlugin.java:50) E/MethodChannel#flutter_mailer(17274): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:222) E/MethodChannel#flutter_mailer(17274): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:96) …

該当のソースコード

//ファイルを作る関数 import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_mailer/flutter_mailer.dart'; void main() => runApp(new MyApp()); class MyApp extends StatefulWidget { @override _MyAppState createState() => new _MyAppState(); } class _MyAppState extends State<MyApp> { final GlobalKey<ScaffoldState> _scafoldKey = GlobalKey<ScaffoldState>(); // Platform messages are asynchronous, so we initialize in an async method. Future<void> send() async { // Platform messages may fail, so we use a try/catch PlatformException. final MailOptions mailOptions = MailOptions( body: null, subject: 'ファイル添付', recipients: [' '], isHTML: true, // bccRecipients: ['other@example.com'], ccRecipients: [' '], attachments: [_createFile().path], ); String platformResponse; try { await FlutterMailer.send(mailOptions); platformResponse = 'success'; } catch (error) { platformResponse = error.toString(); } // If the widget was removed from the tree while the asynchronous platform // message was in flight, we want to discard the reply rather than calling // setState to update our non-existent appearance. if (!mounted) return; _scafoldKey.currentState.showSnackBar(SnackBar( content: Text(platformResponse), )); } @override Widget build(BuildContext context) { return new MaterialApp( theme: ThemeData(primaryColor: Colors.red), home: new Scaffold( key: _scafoldKey, appBar: new AppBar( title: const Text('Plugin example app'), actions: <Widget>[ IconButton( onPressed: send, icon: const Icon(Icons.send), ) ], ), body: SingleChildScrollView( child: new Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( mainAxisSize: MainAxisSize.max, // mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, ), ), ), ), ), ); } //ファイルを作る関数 File _createFile(){ Directory current = Directory.current; String fileName = current.path +"\sample.csv"; print(fileName); File file = new File(fileName); file.writeAsString("Hello World!!"); return file; } }

試したこと

実行をしてメールボタンを押しsendを呼び出すと、attachmentに添付ファイルが付いていてほしいです。
関数内でprintすると「\sample.csv」となりDirectory currentがしっかり返っているか不明です。

補足情報(FW/ツールのバージョンなど)

Windows10 , Androidバージョン5.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。当コードはおそらくスコープが原因で、別クラスにファイルを作成し呼び出しが不十分だったためファイルが消滅していたのだと思います。
path_providerというライブラリを使用したところできました。

投稿2019/11/23 01:28

odekakeneko

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問