[解決済み] Androidのカメラの向きを正しく設定するには?
2023-03-31 08:13:51
質問
Android でデバイスの向きに応じてカメラの向きを設定したいのですが、何も動作していないようです。カメラ パラメータと同様に Surface も回転させようとしましたが、ポートレート モードのカメラ プレビューは常に上下逆さまになってしまいます。正しく表示するためには、時計回りに90度回転させる必要があります。以下は、現在使用しているコードで、ランドスケープ モードでのみ機能します。
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera();
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.2;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Size size : sizes) {
Log.d(TAG, "Checking size " + size.width + "w " + size.height
+ "h");
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the
// requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
List<Size> sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, width, height);
Log.d(TAG, "Surface size is " + width + "w " + height + "h");
Log.d(TAG, "Optimal size is " + optimalSize.width + "w " + optimalSize.height + "h");
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
// parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
};
どのように解決するのですか?
Google のカメラ アプリを使用して、最終的にこれを解決しました。センサーを使用して携帯電話の向きを取得し、EXIF タグを適切に設定するのです。カメラから出力される JPEG は自動的に向きを変えてはくれません。
また、カメラのプレビューはランドスケープ モードでのみ正しく機能します。アクティビティ レイアウトを縦向きにする必要がある場合は、向きセンサーからの値を使用して手動で行う必要があります。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み] Android端末の向きを確認する
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] Androidでマイナスマージンを使用するのは悪いことですか?
-
[解決済み] バイト配列の画像ファイルをビットマップに変換するには?
-
[解決済み] Android Studioの「未実装メソッドの追加」機能
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] アンドロイドフラグメント onRestoreInstanceState
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] Android Studio - あいまいなメソッド呼び出し getClass()
-
[解決済み] これはどういうことですか?失敗 [INSTALL_FAILED_CONTAINER_ERROR]?
-
[解決済み] アンドロイドのクライアントでヒープアップデートを有効にする方法
-
[解決済み] react nativeアプリのバージョン番号を更新する方法
-
[解決済み] ProjectScopeServices に Factory タイプのサービスはありません。
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない