はじめに
初めまして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内に以下の記述を追加しましょう。
1 2 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
次にMainActivityファイルでrequestPermissions()を行い端末が外部のストレージにアクセスすることを許可します。
1 2 3 4 | // 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); } |
これでパーミッションリクエストを行う事ができます。
実装してみましょう
今回作成するソースコード全容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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(); } } } |
今回作成したコードになります。以下こちらから説明します!
送信先のリファレンス取得
1 2 3 4 | //ストレージのインスタンスの取得 FirebaseStorage storage = FirebaseStorage.getInstance(); //インスタンスからストレージのリファレンスを取得 StorageReference storageRef = storage.getReference(); |
ストレージのリファレンスを取得する為にFirebaseStorageクラスのインスタンスを作成します。インスタンスからgetReference()メソッドを用いてリファレンスを取得します。StorageReferenceを設定することでストレージへのアップロードや削除などの操作を行うことができるようになります。
ストリームをつかって画像の送信
StrageReferenceのputStream()メソッドを使って端末の画像をCloud Storage上にアップロードします。呼び出し元から受け取ったPathNameから取得したFileでFileInputStreamを作成します。前項で取得したリファレンスとSaveNameで保存先のリファレンスを取得しputStream()をおこないます。streamはclose()するのですが、今回はリスナーの中で記述しているので不格好です。。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //ストリームをつかって取得したリファレンスに画像の送信 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を使わない場合、以下のルールに変更することでストレージに変更を加えることができるようになります。
※どのようなユーザーでも変更、修正が加えられる設定になりますのでお気をつけを。
1 2 3 4 5 6 7 8 | rules_version = '2'; service firebase.storage { match /b/abcde.appspot.com/o { match /{allPaths=**} { allow read, write; } } } |
権限に関する情報はこちらから閲覧することができます。
さいごに
今回はAndroid端末からFirebase Cloud Storageに画像をアップロードする機能を実装しました。Firebaseはすごく便利で関単に実装できるという評判を聞いていましたが、コンソールの設定等でつまづく所があり、実装に大変時間がかかりました。Firebaseを使ってアプリ開発を行いたいと考えている方に少しでも尽力できたら幸いです。