2012年3月24日土曜日

[Android] intentでカメラアプリを呼び出し画像を取得する

前回は端末内の画像を読み込む処理について書きましたが、今回はカメラアプリを起動して撮影した画像を取得する処理についてです。

まずはカメラを起動するところから。

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 0);

これでカメラアプリが立ち上がり、撮影すると呼び出し元のアプリへ戻りonActivityResultが呼ばれます。

カメラアプリが複数登録されている場合はどれを起動するか選択できるのですが、ここからは標準のカメラアプリを起動した場合について扱っていきます。

カメラを起動するということは画像を取得したい場合がほとんどだと思うのですが、標準のカメラアプリではintentのExtraDataにMediaStore.EXTRA_OUTPUTを指定したかどうかによって画像の取得の仕方が変わります。


MediaStore.EXTRA_OUTPUTなしの場合

こちらは簡単で、下記のようにすれば取得できます。

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            Bitmap bitmap = (Bitmap)data.getExtras().get("data");
        }
    }

ただし、このやり方で取得できるBitmapは縮小されていて、ソースを読むと50 * 1024ピクセルまでに制限されています。(android-2.3.7_r1.0時点)

これはAndroidの作法としてintentのExtraDataにはあまり大きなデータを入れるべきではないからだと思います。


MediaStore.EXTRA_OUTPUTありの場合

こちらの場合は、自分で指定したUriに画像を書き込ませることができます。
サイズはオリジナルのままです。

あらかじめ

        mSaveUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/tmp.jpg"));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mSaveUri);

のように指定してカメラを立ち上げると、mSaveUriのパスにJPEG画像として保存してくれます。
mSaveUriは自分で定義したUriのオブジェクト変数です。

ちなみに、標準のカメラアプリは撮影した際の時刻をもとにファイル名をつけてsdcardに保存している(android-2.3.7_r1.0時点)のですが、これと同じディレクトリ、同じ命名ルールで保存させたい場合は下記のように指定してやるとできます。

        final Date date = new Date(System.currentTimeMillis());
        final SimpleDateFormat dataFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");
        final String filename = dataFormat.format(date) + ".jpg";
        mSaveUri =
                Uri.fromFile(new File(Environment.getExternalStorageDirectory().toString()
                        + "/DCIM/Camera", filename));

注意点としては、mSaveUriはそのままではMediaStoreのDBに登録されないため、何もしないと撮った画像がギャラリーなどの画像閲覧アプリに表示されません。

ここに関しては、下記のサイトが参考になると思います。

インテントでカメラを呼び出す方法の補足

今回と前回の内容を合わせると、画像を読み込む際にギャラリーとカメラのどちらからでも読み込めるようになります。

0 件のコメント:

コメントを投稿