カテゴリー: Android

【Android】Firebase Cloud Storageに画像をアップロードする

はじめに

初めましてmatsunariです。普段はJavaを使ったAndroidアプリの開発を行っています。今回は、FirebaseのCloudStorageにアプリから画像データをアップロードする実装をしたいと思います。このブログでは以前にもFirebaseに関する記事があったと思いますが簡単にFirebaseについて書いておきます。

Firebaseとは

FirebaseはGoogleが提供しているモバイルおよびWebアプリケーションのバックエンドサービスで、BaaS(Backend as a Service)の一種です。
アプリのバックエンドサービス(データベースやストレージ、アナリティクスなど)を時間をかけて作ったり管理する必要がなくアプリの開発に集中することができます。

Firebase Cloud Storage を使う為の準備

今回はCloud Storageを使ってアプリ内の画像データをストレージにアップロードして保存するための実装を行ってみようと思います。
まずはFirebaseの公式チュートリアルに従って、プロジェクトを作成しましょう。
Cloud Storageのチュートリアルを参考にFirebaseSDKの導入を含んだ事前準備をおこないます。

パーミッションの追加

Android 6.0(API レベル 23)以降の端末ではパーミッションをリクエストする必要があるります。AndroidManifest内に以下の記述を追加しましょう。

    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

次にMainActivityファイルでrequestPermissions()を行い端末が外部のストレージにアクセスすることを許可します。

        // Android 6, API 23以上でパーミッションの確認
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_CONTACTS);
        }

これでパーミッションリクエストを行う事ができます。

実装してみましょう

今回作成するソースコード全容

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Android 6, API 23以上でパーミッションの確認
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_CONTACTS);
        }
        //pathと保存名を指定してsendImageDataを呼び出し
        sendImageData("/storage/emulated/0/Pictures/MagazinePic-01-2.3.001-bigpicture_01_6.jpg", "landscape1");

    }
    //firebaseでpathと保存名を指定して画像送信をおこなう関数
    private void sendImageData(String pathName, String saveName){

        //送信先のリファレンス取得
        //ストレージのインスタンスの取得
        FirebaseStorage storage = FirebaseStorage.getInstance();
        //インスタンスからストレージのリファレンスを取得
        StorageReference storageRef = storage.getReference();

        //ストリームをつかって画像の送信
        final InputStream stream;
        try {
            stream = new FileInputStream(new File(pathName));
            StorageReference ref = storageRef.child(saveName);
            UploadTask uploadTask = ref.putStream(stream);
            //リスナーの追加
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    // Handle unsuccessful uploads
                    System.out.println(exception.getMessage());
                    try {
                        stream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(getApplicationContext(), "ストレージに保存しました", Toast.LENGTH_SHORT).show();
                    try {
                        stream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

今回作成したコードになります。以下こちらから説明します!

送信先のリファレンス取得

//ストレージのインスタンスの取得
FirebaseStorage storage = FirebaseStorage.getInstance();
//インスタンスからストレージのリファレンスを取得
StorageReference storageRef = storage.getReference();

ストレージのリファレンスを取得する為にFirebaseStorageクラスのインスタンスを作成します。インスタンスからgetReference()メソッドを用いてリファレンスを取得します。StorageReferenceを設定することでストレージへのアップロードや削除などの操作を行うことができるようになります。

ストリームをつかって画像の送信

StrageReferenceのputStream()メソッドを使って端末の画像をCloud Storage上にアップロードします。呼び出し元から受け取ったPathNameから取得したFileでFileInputStreamを作成します。前項で取得したリファレンスとSaveNameで保存先のリファレンスを取得しputStream()をおこないます。streamはclose()するのですが、今回はリスナーの中で記述しているので不格好です。。。。

//ストリームをつかって取得したリファレンスに画像の送信
InputStream stream;
try {
    stream = new FileInputStream(new File(pathName));
    StorageReference ref = storageRef.child(saveName);
    UploadTask uploadTask = ref.putStream(stream);
    //リスナーの追加
    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle unsuccessful uploads
            System.out.println(exception.getMessage());
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Toast.makeText(getApplicationContext(), "ストレージに保存しました", Toast.LENGTH_SHORT).show();
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

Firebaseコンソールでストレージを確認

あらかじめ作成しておいたFirebaseプロジェクトをブラウザで確認しましょう。
Storageに指定した画像が保存されていることが確認できます。

FirebaseStorageルールについて

CloudStorageを初めて利用する場合、ストレージ内の操作を認証されたユーザーしか行うことができません。FirebaseコンソールのStorageセクションで「ルール」というタブがあります。こちらで認証を行っていないユーザーでも画像のアップロードができるように設定を変更することができるようになります。FirebaseAuthenticationを使わない場合、以下のルールに変更することでストレージに変更を加えることができるようになります。
※どのようなユーザーでも変更、修正が加えられる設定になりますのでお気をつけを。

rules_version = '2';
service firebase.storage {
  match /b/abcde.appspot.com/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

権限に関する情報はこちらから閲覧することができます。

さいごに

今回はAndroid端末からFirebase Cloud Storageに画像をアップロードする機能を実装しました。Firebaseはすごく便利で関単に実装できるという評判を聞いていましたが、コンソールの設定等でつまづく所があり、実装に大変時間がかかりました。Firebaseを使ってアプリ開発を行いたいと考えている方に少しでも尽力できたら幸いです。

おすすめ書籍

narimatsutetsuya

シェア
執筆者:
narimatsutetsuya
タグ: AndroidFirebase

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前