Hatena::ブログ(Diary)

YUJimny備忘録

2011-03-08

Xperia 2.1でカメラアプリ起動して画像データ取得

カメラアプリを起動して撮影した画像の保存先を、こちらから指定したファイルにする場合、以下が一般的だが、Xperia2.1版などのカメラアプリは指定したファイルには書き込まれず、通用しないものがある。

public static final int REQUEST_CAMERA = 1;

File file = new File("パス");
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, REQUEST_CAMERA);

いろいろ調べていたらContentProviderで取得できるみたい。

data.getData(): content://media/external/images/media/356

こんな感じに来るらしい。

MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData())でもBitmapは取れるんだけど、今回はファイル名とパスを取得したいので以下のようにやったら一応とれた。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == REQUEST_CAMERA && resultCode == RESULT_OK && data != null && data.getData() != null){
        Cursor c = getContentResolver().query(data.getData(), null, null, null, null);
        if(c.moveToFirst()){
            String id = c.getString(0);
            c = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String{MediaStore.Images.Media.DATA}, MediaStore.Images.Media._ID + "=?", new String{id}, MediaStore.Images.Media.DEFAULT_SORT_ORDER);
            if(c.moveToFirst()){
                File file = new File(c.getString(0));
            }
        }
    }
}

なんかもっとシンプルな書き方がありそうだが。

ほかにもExtrasに入ってくる場合などもあるみたいでやっぱり機種ごとに対応するしかないのかな。

参考

http://d.hatena.ne.jp/gabuchan/20101125/1290681748