Android で Cloud Storage のエラーを処理する

操作が思いどおりにいかないことや、エラーが発生することがあります。

疑わしいときは、返されたエラーをチェックして、エラー メッセージの内容を確認します。次のコードは、Cloud Storage から返されるエラーコードおよびエラー メッセージを検証するカスタム エラーハンドラの実装を示します。このようなエラーハンドラを、Cloud Storage API で使用されるさまざまなオブジェクト(UploadTaskFileDownloadTask など)に追加できます。

Kotlin+KTX

internal inner class MyFailureListener : OnFailureListener {
    override fun onFailure(exception: Exception) {
        val errorCode = (exception as StorageException).errorCode
        val errorMessage = exception.message
        // test the errorCode and errorMessage, and handle accordingly
    }
}

Java

class MyFailureListener implements OnFailureListener {
    @Override
    public void onFailure(@NonNull Exception exception) {
        int errorCode = ((StorageException) exception).getErrorCode();
        String errorMessage = exception.getMessage();
        // test the errorCode and errorMessage, and handle accordingly
    }
}

エラー メッセージをチェックし、Cloud Storage セキュリティ ルールで操作を許可した後でもエラーを解決できない場合は、サポートページにアクセスしてお問い合わせください。

エラー メッセージを処理する

エラーが発生する理由として、ファイルが存在しない、目的のファイルへのアクセス権がユーザーにない、ユーザーがファイルのアップロードをキャンセルしたなど、多くの理由が考えられます。

問題を適切に診断してエラーを処理するには、クライアントで発生するすべてのエラーとその発生理由について説明した、以下の全一覧をご覧ください。この表のエラーコードは、StorageException クラスで整数定数として定義されています。

コード 理由
ERROR_UNKNOWN 不明なエラーが発生しました。
ERROR_OBJECT_NOT_FOUND 目的の参照にオブジェクトが存在しません。
ERROR_BUCKET_NOT_FOUND Cloud Storage 用にバケットが構成されていません。
ERROR_PROJECT_NOT_FOUND Cloud Storage 用にプロジェクトが構成されていません。
ERROR_QUOTA_EXCEEDED Cloud Storage バケットの割り当てを超えました。無料枠でご利用中の場合は、有料プランにアップグレードしてください。有料プランをお使いの場合は、Firebase サポートまでお問い合わせください。
ERROR_NOT_AUTHENTICATED 承認されていないユーザーです。認証してから、もう一度お試しください。
ERROR_NOT_AUTHORIZED 目的の操作を行う権限がユーザーにありません。ルールが正しいことをご確認ください。
ERROR_RETRY_LIMIT_EXCEEDED オペレーション(アップロード、ダウンロード、削除など)の最大時間制限を超えました。もう一度お試しください。
ERROR_INVALID_CHECKSUM クライアント上のファイルが、サーバーで受信されたファイルのチェックサムと一致しません。もう一度アップロードしてみてください。
ERROR_CANCELED ユーザーがオペレーションをキャンセルしました。

また、無効な URL を指定して getReferenceFromUrl() を呼び出そうとすると、IllegalArgumentException がスローされます。上記のメソッドの引数は、gs://bucket/object または https://firebasestorage.googleapis.com/v0/b/bucket/o/object?token=<TOKEN> の形式である必要があります。