Open2

Flutterでのアプリ開発で躓いたところを溜めるスクラップ

masafumimasafumi

path_providerを利用時に、Androidだけダウンロードに失敗

CloudStorageからファイルをダウンロードして、端末にダウンロードを実装中に、iOSの実機、Simulatorでは問題なくダウンロードができていたが、なぜかAndroidのみ下記のエラーが発生。

利用パッケージ

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^0.7.0
  firebase_storage: ^7.0.0
  path_provider: ^1.6.28

ソース

  Directory appDocDir = await getApplicationDocumentsDirectory();
  File downloadToFile = File('${appDocDir.path}/test/12345678901234567890.json');

//CloufStorageからファイルを取得し、ローカルに保存
  await firebase_storage.FirebaseStorage.instance
      .ref('test/12345678901234567890.json')
      .writeToFile(downloadToFile);

エラーメッセージ


E/FileDownloadTask(11563): Exception occurred during file write.  Aborting.
E/FileDownloadTask(11563): java.io.IOException: No such file or directory
E/FileDownloadTask(11563): 	at java.io.UnixFileSystem.createFileExclusively0(Native Method)
E/FileDownloadTask(11563): 	at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
E/FileDownloadTask(11563): 	at java.io.File.createNewFile(File.java:1006)
E/FileDownloadTask(11563): 	at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:136)
E/FileDownloadTask(11563): 	at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
E/FileDownloadTask(11563): 	at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
E/FileDownloadTask(11563): 	at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
E/FileDownloadTask(11563): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/FileDownloadTask(11563): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/FileDownloadTask(11563): 	at java.lang.Thread.run(Thread.java:920)
E/StorageException(11563): StorageException has occurred.
E/StorageException(11563): An unknown error occurred, please check the HTTP result code and inner exception for server response.
E/StorageException(11563):  Code: -13000 HttpResult: 200
E/StorageException(11563): No such file or directory
E/StorageException(11563): java.io.IOException: No such file or directory
E/StorageException(11563): 	at java.io.UnixFileSystem.createFileExclusively0(Native Method)
E/StorageException(11563): 	at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
E/StorageException(11563): 	at java.io.File.createNewFile(File.java:1006)
E/StorageException(11563): 	at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:136)
E/StorageException(11563): 	at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
E/StorageException(11563): 	at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
E/StorageException(11563): 	at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
E/StorageException(11563): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/StorageException(11563): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/StorageException(11563): 	at java.lang.Thread.run(Thread.java:920)
E/StorageException(11563): StorageException has occurred.
E/StorageException(11563): An unknown error occurred, please check the HTTP result code and inner exception for server response.
E/StorageException(11563):  Code: -13000 HttpResult: 200
E/StorageException(11563): No such file or directory
E/StorageException(11563): java.io.IOException: No such file or directory
E/StorageException(11563): 	at java.io.UnixFileSystem.createFileExclusively0(Native Method)
E/StorageException(11563): 	at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
E/StorageException(11563): 	at java.io.File.createNewFile(File.java:1006)
E/StorageException(11563): 	at com.google.firebase.storage.FileDownloadTask.processResponse(FileDownloadTask.java:136)
E/StorageException(11563): 	at com.google.firebase.storage.FileDownloadTask.run(FileDownloadTask.java:228)
E/StorageException(11563): 	at com.google.firebase.storage.StorageTask.lambda$getRunnable$7$StorageTask(StorageTask.java:1072)
E/StorageException(11563): 	at com.google.firebase.storage.-$$Lambda$StorageTask$q9YBoR_A8LB-JxTCx8JRQvabaZs.run(Unknown Source:2)
E/StorageException(11563): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/StorageException(11563): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/StorageException(11563): 	at java.lang.Thread.run(Thread.java:920)

解決方法

testディレクトリに格納するのをやめた結果、問題なくAndroidの方でも実機、emulatorともに動作することが確認できました。
パスの長さかと思ったが、ファイル名だけ長くしても問題はなかったので、ディレクトリを含めちゃうとダメだった?みたいです。

File('${appDocDir.path}/test/12345678901234567890.json');
File('${appDocDir.path}/12345678901234567890.json');
masafumimasafumi

Cloud Translation APIをAndroidのみで利用とした時のHTTPリクエストのHTTPヘッダーの設定について

APIキーの制限をAndroidアプリにした際に、パッケージ名とSHA-1証明書のフィンガープリントをGCP上で設定し、dart側のリクエストを投げるところでもHTTPヘッダーを付与しリクエストしたにもかかわらず、エラーが返ってきた。

エラー時のヘッダーのソース

  const HEADERS = {
      'Content-Type': 'application/json',
      'X-Android-Package': 'com.example.test',
      'X-Android-Cert': '00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00',
    };

解決方法

X-Android-Certの設定値は、コロン「:」を含めてはNGみたいのため、コロンを除いた形とする。
※値は各自の値に置き換えること。

  const HEADERS = {
      'Content-Type': 'application/json',
      'X-Android-Package': 'com.example.test',
      'X-Android-Cert': '0000000000000000000000000000000000000000',
  };