SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Android Studio 2で始めるアプリ開発入門

Androidカメラアプリとの連携

Android Studio 2で始めるアプリ開発入門 第15回


カメラアプリとの連携

 カメラアプリのエミュレートができたところで、いよいよコーディングに入っていきます。

カメラアプリへの暗黙的インテント

 カメラアイコンをタップした時の処理メソッドはonCameraImageClick()なので、ここに暗黙的インテントを利用した、カメラアプリ起動のソースコードを記述します。以下のonCameraImageClick()メソッドをUseCameraActivityに追記してください。

リスト3 onCameraImageClick()の追記
public void onCameraImageClick(View view) {
 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  // (1)
 startActivityForResult(intent, 200);  // (2)
}

 追記したらアプリを起動してください。図1と変わらない画面ですが、画面をタップすると今度は以下のようにカメラアプリが起動するようになっています。

図6 暗黙的インテントで起動したカメラアプリ
図6 暗黙的インテントで起動したカメラアプリ

 適当なタイミングでシャッターを切ってください。シャッター横に「✔」のアイコンが表示されます。これをタップしてください。すると、元のカメラ連携サンプルアプリに戻ってきます。

 このように、無事カメラアプリと連携できるようになりました。

 では、ソースコードを見ていきましょう。基本部分は前回解説した暗黙的インテントと差がありません。(1)でIntentオブジェクトをnewし、(2)でアクティビティを起動しています。ただ、少し前回から変わっています。暗黙的インテントでは、Intentをnewするときにアクションを指定しますが、カメラアプリの場合は、(1)のように、

MediaStore.ACTION_IMAGE_CAPTURE

とMediaStoreの定数を使います。また、これだけでカメラアプリを表すので第2引数のURIオブジェクトは不要です。

For Result

 ところで、(2)に注目してください。今までのアクティビティ起動は

startActivity(intent);

でした。ところが、今回はstartActivityForResult()と「ForResult」がついています。アクティビティを起動する際、前回の地図アプリのように起動先アクティビティをそのまま使い続ける場合もありますが、今回のカメラのように一通りの処理(例えば撮影など)が終了した際に、起動元アクティビティに処理を戻すこともできます。カメラアプリの場合は、そもそもそういう使い方を想定していますので、

MediaStore.ACTION_IMAGE_CAPTURE

で起動し、撮影が終了すれば、必ず元のアプリに戻ってきます。その際、何らかの処理を行う必要があります。今回でいえば、撮影された画像を表示することです。その場合はstartActivityForResult()で起動します。そうすると、戻ってきたときにonActivityResult()メソッドが実行されるという仕組みになっています。

 そのstartActivityForResult()ですが、第2引数があります。今回は「200」という数値を渡しています。この使い方については後述します。

戻ってきたときの処理

 では、そのonActivityResult()メソッドを記述しましょう。以下のソースコードを追記してください。

リスト4 onActivityResult()の追記
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
 if(requestCode == 200 && resultCode == RESULT_OK) {  // (1)
  Bitmap bitmap =  data.getParcelableExtra("data");  // (2)
  ImageView ivCamera = (ImageView) findViewById(R.id.ivCamera);  // (3)
  ivCamera.setImageBitmap(bitmap);  // (3)
 }
}

 追記できた時点でアプリを再起動し、画面をタップしてカメラアプリで撮影、✔をタップという一連の操作を行ってください。カメラ連携サンプルアプリに戻ると、以下のように撮影された画像が表示されていると思います。

図7 カメラアプリで撮影した画像が表示された状態
図7 カメラアプリで撮影した画像が表示された状態

 では、ソースコードを解説していきましょう。まず、onActivityResult()の引数を理解しておく必要があります。

第1引数:int requestCode

 先述のstartActivityForResult()の第2引数の値がそのままここに渡されます。もし、同一アクティビティから別の複数のアクティビティを起動する場合、どのアクティビティからの戻りなのかを区別するために利用する数値です。こちらは任意の値が利用できます。したがって、あらかじめどの数値をどのアクティビティの起動に利用するのかを設計しておく必要があります。

第2引数:int resultCode

 起動先アクティビティが、起動元に戻す際に処理が正常に終了したかどうかを伝えてくれる引数です。定数値を利用し、値は以下の2種しかありません。

RESULT_OK:処理が成功
RESULT_CANCEL:処理をキャンセル

第3引数:Intent data

 このアクティビティ起動に関連したIntentオブジェクトそのものです。データの引き渡しがある場合は、この中のextrasを使ってデータを取り出せます。

 上記引数が理解できると(1)が理解できると思います。リスト3の(2)の第2引数で「200」を渡しているので、ImageViewにカメラで撮影された画像を表示するのはrequestCodeが「200」の場合で、かつ、カメラアプリでの処理が成功した場合、つまりresultCodeがRESULT_OKの場合のみです。これが(1)のifブロックの意味です。

 では、ifブロックの中を見ていきましょう。大まかな手順としては、

  1. カメラアプリが撮影した画像を取得(リスト4の(2))
  2. その画像をImageViewに適用(リスト4の(3))

 となります。

 手順1.にあたるのがリスト4の(2)です。カメラアプリは撮影した画像をBitmapオブジェクトの形式に加工し、Intentオブジェクトに格納したうえで処理を戻してくれます。そのため、まずは第3引数のIntentオブジェクトdataからそれを取得します。Bitmapオブジェクトの名前は「data」です。

 次に、手順2.にあたるのがリスト4の(3)の2行です。こちらは特に解説する必要はないでしょう。

次のページ
ストレージ経由での連携

この記事は参考になりましたか?

Android Studio 2で始めるアプリ開発入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9913 2018/05/23 15:37

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー