Android カメラ撮影機能の実装

カメラの撮影を行うときは、カメラアプリに対して撮影要求を発行することで、カメラアプリが起動。
カメラアプリから撮影データが帰ってるくので、それを使用するのが一番手っ取り早い。

が、しかし。
この方法の実装には、実はXperiaかどうか、Xperiaの2.1以降か前かの3パターンの処理が必要となる。

Xperia2.1以降は、特定のディレクトリに写真ファイルを保存する仕様に成っている。
この為、こちらが要求する場所には写真ファイルを保存してくれない。

それらの事情を踏まえたカメラの起動処理と、撮影後の画像受け取り処理はこうなった

カメラ起動処理

 /**

* カメラ起動
* @param parent
* @param photoName 写真ファイル名
*/
public void showCamera(final Activity parent, final String photoName){
//保存先をSDカードのDCIM/Cameraという場所が一般的な保存先らしい。
File tmpFile = new File( Environment.getExternalStorageDirectory().getAbsolutePath()+”/DCIM/Camera/”, photoName );
try{
tmpFile.createNewFile();
}catch (IOException e){
File dir = new File( Environment.getExternalStorageDirectory().getAbsolutePath()+”/DCIM/Camera” );
if( dir.mkdir() ){
try {
tmpFile.createNewFile();
} catch (IOException e1) {
Log.d(“DEBUG”,”カメラ起動時添付ファイル生成エラー:”+e.getMessage() );
ViewsCommon.showAlert(
“カメラの準備ができませんでした。\nSDカードが使用できるかご確認下さい。”,
“カメラ起動エラー”,
parent
);
return;
}
}
}
Uri mImageUri = Uri.fromFile(tmpFile);

Intent intent = new Intent();
intent.setAction( MediaStore.ACTION_IMAGE_CAPTURE );
intent.putExtra( MediaStore.EXTRA_OUTPUT, mImageUri );
parent.startActivityForResult( intent, Define.VIEWS_CAMERA );
}

撮影後の処理

/**
* サブ画面からの復帰時の処理
*/

public void onActivityResult(int requestCode, int resultCode, Intent data){
switch( requestCode ){
case Define.VIEWS_CAMERA:
cameraAfterProc( data );
break;
}
}

/**
* カメラ起動後処理
*/
protected void cameraAfterProc( Intent data ){
String path =
Environment.getExternalStorageDirectory().getAbsolutePath()+
“/DCIM/Camera/” + config.getFileName();

File tmpFile = new File(path);
//キャンセルされた時
if( data == null ) {
if( tmpFile.length() == 0 ) {
//ゴミファイルを削除
if( tmpFile.exists() ) tmpFile.delete();
ViewsCommon.showAlert(
getString( R.string.alert_camera_not_file ),
“画像保存エラー”,
this
);
return ;
}
} else {
//ゴミファイルを削除
if( tmpFile.length() == 0 ) {
if( tmpFile.exists() ) tmpFile.delete();
}

//Intentから画像データを取得する
Uri ret = data.getData();
try{
path = ioCommon.getUri2StringPath(this, ret);
}catch( Exception e){
path = ret.getPath();
}

tmpFile = new File( path );
if( !tmpFile.exists() || tmpFile.length() == 0 ) {
//ゴミファイルを削除
if( tmpFile.exists() ) tmpFile.delete();
ViewsCommon.showAlert(
getString( R.string.alert_camera_not_file ),
“画像保存エラー”,
this
);
return ;
}
}

int width = Define.imageWidth_default;
int height= Define.imageHeight_default;
String tmp = config.getParam( “resizeFlag” );
if( Boolean.getBoolean(tmp) ){
tmp = config.getParam( “resize_width” );
if( tmp != “” ) width = Integer.parseInt(tmp);
tmp = config.getParam( “resize_height” );
if( tmp != “” ) height = Integer.parseInt(tmp);
}

//Bitmap読込ImageCommon.loadImageScaleは独自関数
Bitmap sendImage = ImageCommon.loadImageScale( path, width, height );
//ImageViewに画像をセット
imageView.setImageBitmap( sendImage );
}

とりあえは、こんな感じのコードで上記の3パターンでの動作を確認できている。
が、標準カメラ以外では、画像データを取得出来ない。

そもそも、標準カメラ以外の全てのカメラアプリは、画像の保存場所やデータの引渡し方はアプリに依存するため合わせることはほぼ不可能でしょう