今までintentで内部のカメラアプリを起動さしてjpgをgetしてたけど、今回シャッターの制御が必要になったので自作カメラアプリを作った。
なぜか一番悩んだのが画像の向きだ。
横にしたり縦にしたりしても、Exif情報がなんか1に固定されている。
仕方ないので
protected void configureCameraParameters(Camera.Parameters cameraParams, boolean portrait) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { // for 2.1 and before
if (portrait) {
cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_PORTRAIT);
} else {
cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_LANDSCAPE);
}
} else { // for 2.2 and later
int angle;
int angle2;
Display display = mActivity.getWindowManager().getDefaultDisplay();
switch (display.getRotation()) {
case Surface.ROTATION_0: // This is display orientation
angle = 90; // This is camera orientation
angle2=0;
break;
case Surface.ROTATION_90:
angle = 0;
angle2=270;
break;
case Surface.ROTATION_180:
angle = 270;
angle2=180;
break;
case Surface.ROTATION_270:
angle = 180;
angle2=0;
break;
default:
angle = 90;
angle2=90;
break;
}
Log.v(LOG_TAG, "angle: " + angle);
onOrientationChanged(angle2);
mCamera.setDisplayOrientation(angle);
}
public void onOrientationChanged(int orientation) {
//if (orientation == ORIENTATION_UNKNOWN) return;
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(mCameraId, info);
orientation = (orientation + 45) / 90 * 90;
int rotation = 0;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
rotation = (info.orientation - orientation + 360) % 360;
} else { // back-facing camera
rotation = (info.orientation + orientation) % 360;
}
Camera.Parameters cameraParams = mCamera.getParameters();
cameraParams.setRotation(rotation);
mCamera.setParameters(cameraParams);
}
で対応さした。
謎なのがDisplayのangleとカメラのangleが違うところだ。
よくわからない処理が行われているのだろうきっと。
これで動いたからよしとする。

