chenchen_0811 2024-05-03 15:47 采纳率: 0%
浏览 11
已结题

ndk camera 橫向展示

我使用ndkCamera 開發使用相機的Android APP,在AndroidManifest.xml中我設定開啟相機的Activity 為 android:screenOrientation="landscape",我想限制使用者拍照只能使用橫向模式,但在預覽畫面,與實際畫面有90(270)度的落差。
問題1: 要如何讓預覽畫面跟實際畫面一致?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-03 15:48
    关注

    引自免费微信小程序:皆我百晓生

    要解决这个问题,你需要调整相机预览的旋转角度。在Android中,由于硬件传感器的默认方向通常是竖直的,所以相机预览可能会显示为旋转了90度。你需要根据设备的方向来调整预览的旋转角度。这里是一个示例代码片段,它会根据当前设备方向设置预览的旋转角度:

    首先,在你的Activity中创建一个方法来计算预览的旋转角度:

    private int getPreviewRotation(int orientation, int sensorOrientation) {
        if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
            // Sensor orientation is 90 degrees in landscape mode
            return (sensorOrientation + 270) % 360;
        } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
            // Sensor orientation is 90 degrees in portrait mode
            return (sensorOrientation - 90) % 360;
        }
        return 0; // Should never happen
    }
    

    然后,在初始化 CameraBridgeViewBase(NDKCamera库中的类)时调用这个方法,并设置预览的旋转角度:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Initialize the NDKCamera view
        mCameraView = findViewById(R.id.camera_view);
        mCameraView.setSurfaceTextureListener(this);
    
        // Get the sensor orientation from the CameraManager
        CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        try {
            String cameraId = cameraManager.getCameraIdList()[0];
            CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
            Integer sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
            int rotation = this.getWindowManager().getDefaultDisplay().getRotation();
            int previewRotation = getPreviewRotation(rotation, sensorOrientation);
            mCameraView.setDisplayOrientation(previewRotation);
        } catch (Exception e) {
            Log.e("MainActivity", "Error getting camera characteristics", e);
        }
    }
    

    这段代码首先获取到设备的当前屏幕方向(rotation),然后从CameraManager中获取摄像头的传感器方向(sensorOrientation)。接着,调用我们之前定义的getPreviewRotation方法来计算预览应该旋转的角度,并将其设置给mCameraViewsetDisplayOrientation方法。

    这样,预览画面和实际拍摄的画面就会保持一致了,无论用户是横屏还是竖屏操作。注意,这里的代码适用于大部分设备,但某些特定设备可能还需要额外处理。如果你发现还有问题,可能需要针对那些设备进行特殊处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月10日
  • 创建了问题 5月3日

悬赏问题

  • ¥200 解决登录微信老版本限制封号问题
  • ¥15 mysql中时间处理问题
  • ¥20 讲解此音频放大电路原理及关键部分
  • ¥15 rtsp 转 m3u8 执行后卡在Decoding VUI
  • ¥20 微信小程序转发链接问题,已禁止转发仍能转发的场景
  • ¥15 关于#硬件架构#的问题:根据开片的IC来判断是哪一款
  • ¥15 matlab simulink
  • ¥15 rtos搭建sip协议开发包
  • ¥100 TM4C1290NCPDT 在线调试
  • ¥15 window系统获取某进程打开的文件路径