今まで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が違うところだ。
よくわからない処理が行われているのだろうきっと。
これで動いたからよしとする。