1.Intentで端末のカメラアプリを呼び出す
2.SurfaceViewを使って、カメラスルー画面を直接呼び出す。
どちらもWebをちょっと調べると、サンプルコードが出てきます。
が。
Camera機能は、機種依存動作が強すぎるようで、結構はまりどころです。
やろうとしていたのは、カメラで写真をとって、FaceDetectorで顔認識をするアプリ。
まず、Intentでカメラアプリを呼び出す方法。
カメラにIntentを投げて、onActivityResult()で、結果を受け取る、というのが大体の流れです。
この、結果を受けとる、ところがクセモノで、機種によって受け取れ方が違います。
1.intent.getData()でUriを取得する。HTC Desire/Xperia acroなんかはこれっぽい。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_CANCELED)
{
return;
}
Uri uri = data.getData();
getImage(uri);
}
2. 事前に、IntentのputExtraで書き出し先のUriを指定して、Intentを発行する。SHARP製のAndroidはこの動作。
public void launchCamera()
{
// Create your own image Uri
...
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(intent, 2);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_CANCELED)
{
if (mImageUri == null)
//delete file at mImageUri
return;
}
getImage(mImageUri);
}
このmImageUriに、画像が書きだされてますので、onActivityResult()が呼ばれれば、mImageUriからそのまま取得できます。
3. 1も2もしてくれない・・・Galaxy Sがこのパターン
えっと・・・これが一番困りました。
intent.getData()はnullだし、2をやると、違うUriに書きだしてくるし、、、
結局、画像の中で最新の画像を取得するコードを書いています。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_CANCELED)
{
return;
}
Uri uri = data.getData();
if (uri == null)
{
ContentResolver cr = getContentResolver();
Cursor c = MediaStore.Images.Media.query(cr,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null,null,
MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
c.moveToFirst();
String id =c.getString(c.getColumnIndexOrThrow(BaseColumns._ID);
Uri uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, + id);
getImage(uri);
} else {
getImage(uri);
}
}
もちろん、このコードは、最新の時刻の画像=今とった画像、ではないパターンで問題が出ます。
撮影直後に別のアプリが画像書き出してた、とか。タイムスタンプが未来の画像が入っちゃってる、とか。
エラーチェックを厳しくすればいいのでしょうが、、、
一応、1,2,3ともに共存可能なので、3は最終手段として使う予定です。
なお、Galaxyの場合、以下のような動作もあり。
・撮影が終わってもカメラアプリが終了しないという問題(仕様?)
・カメラ呼び出し元のActivityが終了させられてしまう
前者は、作ってるアプリの仕様上、撮影後はすぐに別画面に遷移させる必要があるので、
別画面を起動するIntentを投げてカメラを終了(中断)させています。
後者が厄介で、Activity::onDestroy()が呼ばれた上、GCまでされちゃいます。
カメラから呼び出し元Activityに戻ると、onCreate()からやり直しです。
つまり変数が全て初期化されます。スッゲ泣ける。
実は、SurfaceViewを使う方法でも、Galaxy Sは大変なんですが、、、それは次回にします。
Intentional Disciplemaking: Cultivating Spiritual Maturity in the Local Church
楽天ブックス
INTENTIONAL DISCIPLEMAKING Ron Bennett NAV PR2001
楽天市場 by 

楽天ブックス
INTENTIONAL DISCIPLEMAKING Ron Bennett NAV PR2001
楽天市場 by 