インテントでカメラを起動し撮影した画像をトリミング(CROP)しようとして、Galaxy Tabでは上手くいくのにINFORBAR(A01)ではNG。かなりハマる。
最初、あれこれ調べて単純に
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
だと画質が悪いとのことで撮影した画像を一旦外部ストレージに保存し後程保存先Uriから画像を読み込むようにするというのが王道パターンのようなので以下で処理する。
//保存先Path
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_HHmmssSSS");
imageName = df.format(date).toString() + "_pinregist.jpg";
String photoPath = Environment.getExternalStorageDirectory()+ imageName;
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE,photoPath);
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
//画像Uri(クラス変数で格納しておく)
ImgUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,ImgUri);
startActivityForResult(intent, REQUEST_CODE_CAMERA);
■戻ってきたら以下で処理(onActivityResult内の処理)
intent = new Intent("com.android.camera.action.CROP");
intent.setData(ImgUri);
intent.putExtra("outputX", トリミング幅); //トリミング後の画像の幅(px)
intent.putExtra("outputY", トリミング高さ); //トリミング後の画像の高さ(px)
intent.putExtra("aspectX", 1); //トリミング後の画像のアスペクト比(X)
intent.putExtra("aspectY", 1); //トリミング後の画像のアスペクト比(Y)
intent.putExtra("scale", true); //トリミング中の枠を拡大縮小できるかどうか
intent.putExtra("return-data", true); // トリミングしたデータを返却するかどうか
startActivityForResult(intent, REQUEST_CROP_PICK);
上記処理でGalaxy TabはOKでINFORBARはNG。
調べた挙句Sharpのサイトより以下を発見
S03を2.2へアップデートするとSHカメラとの連携が上手くいかなくなる
「コンテンツプロバイダに登録時の戻りUri」に対応しない仕様」
となっているとのこと。これが原因。対応策として
「ファイルパスから生成したUri」を指定」
とのこと。
なので
ImgUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
を
ImgUri =Uri.fromFile(new File(Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera", photoPath));
と修正。これでINFORBARでもカメラで撮影⇒保存のあとintentが戻ってくるようになりました。
ただこれで終わるほど簡単ではありませんでした。
後篇に続く