質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.39%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1801閲覧

Flutterのmethodchannelを用いてfirebase_storageのリファレンスのリストを取得したい

moriman

総合スコア615

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/06/19 05:23

https://pub.dev/packages/firebase_storage#-example-tab-
上記ページなど見て、flutterアプリでfirebase_storageを使う方法をいろいろ試してみてるのですが、
firebase_storageのバケットに保存されている全てのファイルのリファレンスを取得するメソッドが
flutterfireの中から見つけられません。

あるのでしょうか?
無いとしたら、アップデートでfirebase_storageに実装されるのを待つか、
自分でやるか、どちらかしかないのでしょうか?

自分でやる場合、flutterのmethodchannelを使うらしいのですが。
https://flutter.dev/docs/development/platform-integration/platform-channels
まずflutter側で呼び出したいところでinvokeMethod()を呼び出し。

android側で全ファイルのリファレンスのリストを取得するメソッドを実装。

android側から帰ってきたリストをflutter側で受け取って、それを使って画像表示などする。

という流れになるのかなあ、という感じです。

上記のバッテリーレベルを取得するサンプルは何とかやってることは何となく掴んだので、それにそって
リファレンスのリストを取得する処理を作ろうと思っています。

android側で実装する場合、MainActivity.ktというファイルにやりたい処理(全ファイルのリファレンスのリストを
取得する処理)を書いていくようです。
kotlinでファイルのリファレンスのリストを取得する処理は
https://firebase.google.com/docs/storage/android/list-files?hl=ja
上記ページにサンプルがあるので、それを真似て書いていこうという感じです。

val storage = Firebase.storage val listRef = storage.reference.child("text")

とりあえずMainActivity.kt内に上記のようにストレージインスタンスを作るコードを書いて動かすと、

e: /Users/userno1/development/myapp202/android/app/src/main/kotlin/com/example/myapp202/MainActivity.kt: (54, 23): Unresolved reference: Firebase

上記のようなエラーが出ます。
どうすれば良いでしょうか?

flutterだけで(methodchannelを使わずに)、firebase_storageに接続し、ファイルのアップロード、ダウンロードまではできています。(サンプルがエラー無く動かせている。)

バッテリーレベルのサンプルでもそれに必要なライブラリをMainActivity.kt内でインポートしているのですが、
今回もfirebaseの必要なライブラリをMainActivity.kt内でインポートする必要があるのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://stackoverflow.com/questions/58409185/flutter-get-all-images-from-firebase-storage

pubspec.yamlを以下のようにし、

firebase_storage: git: url: git://github.com/danysz/flutterfire.git ref: master path: packages/firebase_storage

こんな感じで実装できないですか?

void getFirebaseImageFolder() { final StorageReference storageRef = FirebaseStorage.instance.ref().child('Gallery').child('Images'); storageRef.listAll().then((result) { print("result is $result"); }); }

投稿2020/06/22 00:26

tepci

総合スコア419

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

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

moriman

2020/06/23 03:42

回答をいただきましてありがとうございます。 pubspec.yamlをお示し頂いたように変えると、 import 'package:firebase_storage/firebase_storage.dart'; の行で Target of URI doesn't exist: 'package:firebase_storage/firebase_storage.dart'. Try creating the file referenced by the URI, or Try using a URI for a file that does exist. のエラーが出るのですが、どうしたら良いでしょうか。 変更前のpubspec.yamlの対応箇所は firebase_storage: ^3.1.6 としていました。 あとpubspec.yamlで何をしているのかよく分からない状態なのですが、どこを見れば調べられますでしょうか。
tepci

2020/06/23 04:10

「flutter pub get」を実行して、再度エラーが解消されるかどうか確認してください。 pubspec.yamlでは、Flutterアプリにインストールするパッケージを定義しています。 定義した後、「flutter pub get」を実行するとパッケージがインストールされます。 おそらくfirebase_storageの3.1.6では、listAll()はまだ実装されていませんが、回答した通りに定義すると、listAll()が実装されたバージョンを取得できるはずです。(確認はしてませんがリンク先にはそう書いてあります。)
moriman

2020/06/23 05:05

再度回答を頂きましてありがとうございます。 もう一度試してみたところ何故かエラーが出ませんでした。 全件リストが取得できました。 ありがとうございました。 すみません、よろしければもう一つ、 listAll()メソッドの返り値の型を知りたいのですが、 そのためにはlistAll()メソッドの実装を見たいのですが、 どこに行けば見られますでしょうか? よく見ると、 https://stackoverflow.com/questions/58409185/flutter-get-all-images-from-firebase-storage には「返り値の型はFuture<dynamic>」とありますね。 こちらとしてはfirebase_storage内の各ファイルのrefrence(StorageReference型)が取得できれば、 task = ref.writeToFile(tempFile); のようにして全ファイルをダウンロード(取得)できそうな気がします。 結局StorageReference型は一見「bucket,path,name」の三つで構成されているのか、listAll()メソッドの返り値のitemsプロパティはMap<StorageReference>型か、という風に見えますが、よく見ていくとそういうわけでもなさそうです。非常に複雑でこんがらがりますね。
tepci

2020/06/23 06:18

取得できたようでひとまず安心しました。 自分は触ってないのでわからないのですが、以下のprintで出力されるのは「bucket,path,name」で構成されたMap型のリストですか? final StorageReference storageRef =  FirebaseStorage.instance.ref().child('Gallery').child('Images'); storageRef.listAll().then((result) { print("result is $result"); });
moriman

2020/06/23 08:26 編集

listAll()メソッドの結果は { prefixes: {}, pageToken: null, items: { foo3d9abd00-91f0-11ea-9c93-a128c8fdb0e9.mov: { bucket: prono9.appspot.com, path: /text/foo3d9abd00-91f0-11ea-9c93-a128c8fdb0e9.mov, name: foo3d9abd00-91f0-11ea-9c93-a128c8fdb0e9.mov }, foofe573320-91f0-11ea-a8a6-9f40fe8d6433.mov: { bucket: prono9.appspot.com, path: /text/foofe573320-91f0-11ea-a8a6-9f40fe8d6433.mov, name: foofe573320-91f0-11ea-a8a6-9f40fe8d6433.mov } } } このようになりました。firebase_storageには二つの動画ファイルが保存されています。 json、というかMap型ですかね。 まだ試していないんですが、一つ目のファイルなら、 final StorageReference ref = widget.storage.ref().child('text').child('foo3d9abd00-91f0-11ea-9c93-a128c8fdb0e9.mov'); のような感じで取得できるような気がします。やってみようと思います。
tepci

2020/06/23 23:18

ファイル名とパスが返ってきてるのでなんとかなりそうですね。
moriman

2020/06/25 02:27

何とか全件取得できました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問