2014-08-29 95 views
0

后获得设备的方向我想获得设备的方向,理论上应该工作中使用此:Android的 - 拍照

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

您最好使用图像方向,因为某些设备+相机程序执行奇怪的方向更改。 – 2014-08-29 13:59:46

+0

是的,我注意到了,这就是为什么我想知道设备方向(需要更长时间才能解释为什么),主要问题是我的exif图像数据似乎也很奇怪...... – deimos1988 2014-08-29 14:01:12

+1

某些设备没有写入EXIF数据。您必须从'MediaStore.Images.ImageColumns.ORIENTATION'检查方向。无论如何,我总是检查级联中的所有方向:MediaStore,EXIF,设备。 – 2014-08-29 14:06:03

回答

3

如果设备未写入可靠的EXIF方向,则可能是由方向传感器(加速度计)的硬件问题引起的。如果是这种情况,检查应用中的方向是没有意义的。

我可以解释为什么有时候您的活动在通过Intent拍摄照片后不会报告onActivityResult()中的正确(人像)方向,以及如何以更稳健的方式检测到此方向。但不幸的是,这将是徒劳的。

当应用程序从相机应用程序接收控制权时,您不能依赖设备的方向,因为在最终用户实际拍摄照片后,她会预览照片,可能会再次尝试,最后接受(或拒绝)照片。在所有这些在捕获之后的漫长过程期间,终端用户可能有意识地或无意识地旋转设备多次。所以,如果你不能依靠EXIF的方向,但可以依靠设备传感器,你别无选择,只有use a Camera object,在你的应用程序内拍照。

现在,为了记录,这里是我在第二段中提到的解释大纲。

当您的应用收到onActivityResult()回调时,可能会在您的活动被系统销毁(为相机应用释放更多内存)后发生。您无法控制是否会发生这种情况,但您可以知道是否将控制返回给您的应用程序。

在这种情况下,您的活动将不知道其方向。它稍后确定此方向,即在onResume()回调之前。因此,在onActivityResult()以内时,您不能盲目依赖活动方向。您应该直接读取加速度传感器,并计算方向是横向还是纵向(请参阅OrientationEventListener)。

不幸的是,这只是一个理论选项,正如我上面所解释的。幸运的是,当您使用自定义相机时,您可以在活动中简单地使用上述OrientationEventListener类来可靠地确定方向(至HW传感器可靠)。

+0

非常感谢您的回答。但是你说我应该实现我自己的相机,而不是使用外部应用程序,对不对? – deimos1988 2014-09-01 08:15:08

+0

我会先试着理解为什么EXIF标志不起作用。此外,证明HW传感器工作正常非常重要。但是你是对的,我的回答总结如下:如果你不能依靠EXIF方向,但可以依靠设备传感器,你别无选择,只能使用Camera对象,在你的app_中拍照。 – 2014-09-01 08:44:46

+0

您所说的关于销毁活动以释放相机内存可能是导致行为不一致的原因。我改变了一些设置,所以使用较少的内存,不知道它是否会像这样永远工作。 我正在显示在Dialogfragment中拍摄的图片 - 可能是在获取设备方向之前等待0.5秒,然后显示带有该图像的DialogFragment的可能性? – deimos1988 2014-09-01 11:12:29