Android 是安卓';是否正确记录了CAMERANFO.方向?实施不当?

Android 是安卓';是否正确记录了CAMERANFO.方向?实施不当?,android,camera,orientation,Android,Camera,Orientation,在安卓系统中,您可以通过检索CameraInfo来获取Camera的属性描述。我对方向感兴趣,如中所述 然而,文档似乎与我的四台设备的行为不一致,而且,我有第五台设备的消息,这似乎是固定值的变化 文件特别指出: 该值是相机图像需要旋转的角度 顺时针旋转,使其在显示屏上以自然方式正确显示 方向。。。例如,假设一个设备有一个自然高的 屏幕。后向摄像头传感器安装在横向位置。你是 看着屏幕。如果摄像头传感器的顶部对齐 当屏幕右边缘处于自然方向时,值 应该是90岁。如果前向摄像头传感器的顶面 与屏幕右侧对

在安卓系统中,您可以通过检索
CameraInfo
来获取
Camera
的属性描述。我对方向感兴趣,如中所述

然而,文档似乎与我的四台设备的行为不一致,而且,我有第五台设备的消息,这似乎是固定值的变化

文件特别指出:

该值是相机图像需要旋转的角度 顺时针旋转,使其在显示屏上以自然方式正确显示 方向。。。例如,假设一个设备有一个自然高的 屏幕。后向摄像头传感器安装在横向位置。你是 看着屏幕。如果摄像头传感器的顶部对齐 当屏幕右边缘处于自然方向时,值 应该是90岁。如果前向摄像头传感器的顶面 与屏幕右侧对齐,值应为270

但在上述示例中,是相机图像相对于自然高度方向顺时针旋转90度,而不是相反。也就是说,顶部与设备右侧对齐的图像需要顺时针旋转270度才能与设备顶部对齐

至少,我的所有四台设备都报告该值为“90”,并且当以自然方向保持时,所有设备的作用都好像相机的顶部是设备的右侧。也就是说,图像必须顺时针旋转270度,而不是90度,以匹配自然方向。这个例子似乎是正确的;第一行没有

示例代码似乎支持我的结论,因为它只在如上所述解释方向时给出正确的结果

奇怪的是,我从一个用户的设备上得到了日志证据,显示它报告这个值时有时为90,有时为0!这应该是相机在设备中的位置的物理属性,对吗

  • 有人能确认文档的第一行实际上是错误的,并且示例是正确的吗
  • 是否有人观察到CameraInfo.orientation的值发生变化?文档中是否有证据表明这是合法行为,或者这可能是设备中的错误
  • 我还没有遇到过任何其他相关的评论、经验和问题吗

  • 我相信,经过深思熟虑,我已经回答了自己的问题

    这个例子是正确的。而且,文本实际上是正确的。在给定的示例中,如果预览数据显示在屏幕上,它将显示为逆时针旋转90度,因为数据中的“向上”位于显示器的右侧,并且显示在显示器上,可以说,“向上”位于数据的左侧。因此,有必要在显示之前通过顺时针旋转图像数据90度进行补偿

    我认为将这个数字理解为相机安装时相对于自然方向的旋转更自然

    出于这个原因和其他原因,我得出结论,显示方向变化值的设备就是有缺陷的。至少,当它报告0时,它的数据表现为“90”是正确的值

    1) 有人能确认文件的第一行是事实吗 错了,这个例子是对的

    您已经在中彻底解决了这一问题,感谢后续解释

    2) 是否有人观察到CameraInfo.orientation的值发生变化?文件中是否有证据表明这是合法行为,或者这可能是一种犯罪行为 设备中的bug

    虽然我可以很容易地想象这在原则上是一个bug,但它仍然是一个相当严重的bug,会影响所有与成像相关的应用程序,因为结果信息会通过EXIF嵌入到照片中(例如,其他的片刻)

    <> P>因此,我认为它更有可能是数以千计的Android设备之一的实际特征,即一个相机可以选择物理旋转镜头。虽然我目前还不知道有基于Android的手机,但过去也有类似的手机,例如(~2004)或三星SCH-a930(~2006)(参见旋转镜头),所以如果Android领域也出现类似的情况,我也不会感到惊讶

    顺便说一句,有一个没有答案的问题,为什么我的照片是颠倒的还是倒着的。关于后者:

    最近我的照片一直颠倒或倒转。这是为什么 发生了什么,我该如何修复它

    这实际上可能是旋转调整硬件/固件中的错误;)


    因此,总而言之,我认为最好是切实做好准备,让方向能够改变,直到你有更确切的证据证明这确实是一个有缺陷的设备。

    另一种解决问题的方法是扩展方向EventListener 并覆盖onOrientationChanged方法,您将获得手机的方向,即使自动旋转被禁用(因为侦听器通过传感器发出旋转事件)

    您应该在onResume/onPause上启用和禁用方向侦听器,以防止电池电量耗尽

        private class OnOrientationChange extends OrientationEventListener {
        private boolean isEnabled = false;
    
        public OnOrientationChange(Context context) {
            super(context);
            disable();
        }
    
        @Override
        public void onOrientationChanged(int orientation) {
            if (camera != null && orientation != ORIENTATION_UNKNOWN) {
                int newOutputOrientation = getCameraPictureRotation(orientation);
    
                if (newOutputOrientation != outputOrientation) {
                    outputOrientation = newOutputOrientation;
    
                    Camera.Parameters params = camera.getParameters();
    
                    params.setRotation(outputOrientation);
    
                    try {
                        camera.setParameters(params);
                        lastPictureOrientation = outputOrientation;
                    } catch (Exception e) {
                        Log.e(getClass().getSimpleName(),
                                "Exception updating camera parameters in orientation change",
                                e);
                        // TODO: get this info out to hosting app
                    }
                }
            }
        }
    
        @Override
        public void enable() {
            isEnabled = true;
            super.enable();
        }
    
        @Override
        public void disable() {
            isEnabled = false;
            super.disable();
        }
    
        boolean isEnabled() {
            return (isEnabled);
        }
    }
    

    感谢大家对解决方案的共同承诺

    感谢大家继续解释(+1)-几天前我读了你的问题后,试图将我的头绕在这一点上,但事实上,当我在脑海中旋转所有这些几何图形时,我感觉睡着了;)是的,我想我终于完全明白了所有API调用是如何工作的。所有记录都正确无误;它不一定解释在我认为直觉的方式,至少一个调用似乎工作“倒退”到其他人。但是,这确实很难推理。如果你遇到我可能有答案的问题,就发布一个SO问题。酷,我会认为这可能是一个尽可能好的答案:是的,方向可能会改变,是的,可能会有一些e