我想获得设备方向,理论上应该使用它:
getActivity().getResources().getConfiguration().orientation;
但是我注意到有时候,在使用此代码调用相机后:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFile(1); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
intent.putExtra(GlobalDefines.IMAGE_NR, 1);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE_1);
在我拍摄完图像后,当我尝试在onActivityResult中获取设备方向(在拍摄照片后调用)时,设备方向会显示“横向”模式,尽管我以纵向模式拍摄了照片并且设备以纵向模式保持。
奇怪的是,这只发生在10次中的大约3次。看起来在拍摄照片时,设备方向在内部更改为“横向模式”(即使图像是以纵向模式拍摄的),并且在拍摄照片后,需要一段时间,直到设备意识到它处于纵向状态模式。
我该怎么办?
答案 0 :(得分:3)
如果设备没有写入可靠的EXIF方向,这可能是由方向传感器(加速度计)的硬件问题引起的。如果是这种情况,检查应用中的方向是没有意义的。
我可以解释为什么有时候您的活动在通过Intent拍照后onActivityResult()
中无法报告正确(人像)方向,以及如何以更健壮的方式感知这种方向。但不幸的是,这将是徒劳的。
当您的应用程序从相机应用程序接收控制权时,您无法依赖设备的方向,因为在最终用户实际捕获图片后,她将预览它,可能再次尝试,最后接受(或拒绝照片。在捕获之后的所有这个漫长的过程中,设备可以被最终用户有意或无意地旋转许多次。因此,如果你不能依赖EXIF方向,但可以依靠设备传感器,你别无选择,只能 use a Camera object ,在你的应用中拍照。
现在,为了记录,这是我在第二段中提到的解释概要。
当您的应用收到onActivityResult()
回调时,可能会在您的活动被系统销毁之后发生(为相机应用释放更多内存)。您无法控制是否会发生这种情况,但您可以知道控制权返回到您的应用时是否会出现这种情况。
在这种情况下,您的活动尚不知道其方向。它会在onResume()
回调之前确定此方向。因此,在onActivityResult()
内部时,您不能盲目地依赖于活动方向。您应该直接读取加速计传感器,并计算方向是横向还是纵向(请参阅OrientationEventListener
为exlaxple)。
不幸的是,这只是一个理论选择,正如我在上面所解释的那样。幸运的是,当您使用自定义相机时,您只需在活动中使用上述OrientationEventListener
类来可靠地确定方向(在HW传感器可靠的范围内)。