カスタム動画アプリを作ってみました。マニフェスト2.2のみ(API 8)の設定を使用して動作します。
すべてうまくいきますが、ポートレートモードのビデオがランスケープモードのビデオと変わらない理由がわかりません。
デバイスの向きの変更を検出するには、surfaceChanged()内でこのコードを使用します
if (mCamera != null) {
Camera.Parameters p = mCamera.getParameters();
try {
mCamera.stopPreview();
} catch (Exception e) {
// TODO: handle exception
}
int previewWidth = 0;
int previewHeight = 0;
if (mPreviewSize != null) {
Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
switch (rotation) {
case Surface.ROTATION_0:
previewWidth = mPreviewSize.height;
previewHeight = mPreviewSize.width;
mCamera.setDisplayOrientation(90);
break;
case Surface.ROTATION_90:
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
mCamera.setDisplayOrientation(0);
break;
case Surface.ROTATION_180:
previewWidth = mPreviewSize.height;
previewHeight = mPreviewSize.width;
mCamera.setDisplayOrientation(270);
break;
case Surface.ROTATION_270:
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
mCamera.setDisplayOrientation(180);
break;
}
p.setPreviewSize(previewWidth, previewHeight);
mCamera.setParameters(p);
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.d(TAG, "Cannot start preview.", e);
}
}
チャームのように機能します。デバイスの表面変更の向きを回転させて、surfaceChangedを呼び出すと、カメラは適切なDisplayRotationに設定されます。
問題は、ビデオが横向きモードでキャプチャされたのか、縦向きモードでキャプチャされたのかを後で判断する方法です。私が得たように、すべてのビデオは横向きでキャプチャされます。プレビュープロセスにのみ影響するsetDisplayOrientationには依存しません。
また、問題を調査すると、標準のカメラアプリを使用すると、ビデオファイル(MediaInfoに表示)に特別なタグが書き込まれることに気付きました。回転:ポートレートでキャプチャされたビデオの場合は90。
しかし、MediaRecorderクラスはそうではありません。
それが問題のようです。誰かがこれを解決する必要がありますか?