android– 使用ACTION_IMAGE_CAPTURE拍摄的图像在某些Gingerbread设备上的ExifInterface.TAG_ORIENTATION返回1

概述使用ACTION_IMAGE_CAPTURE活动时,我遇到了方向问题.我已经使用了TAG_ORIENTATION,因此我会相应地旋转图片.但现在我们发现在一些较新的设备上这不起作用.事实上,它为所有方向返回1.这是我们观察到的设备列表;>三星Infuse4G(2.3.3)>三星GalaxySIIX(2.3.5)>SonyXperiaArc(2.

使用ACTION_IMAGE_CAPTURE活动时,我遇到了方向问题.我已经使用了TAG_ORIENTATION,因此我会相应地旋转图片.但现在我们发现在一些较新的设备上这不起作用.事实上,它为所有方向返回1.

这是我们观察到的设备列表;

>三星Infuse 4G(2.3.3)
>三星galaxy SII X(2.3.5)
> Sony Xperia Arc(2.3.3)

有趣的是,一旦这个图像是图库它正确显示,如果我选择它,TAG_ORIENTATION就会正确填充.因此, *** 作系统以某种方式正确填充此信息,但不在ActivityResult上填充.

确定方向的最可靠方法是什么?有人在另一个问题上建议比较高度和宽度但是在获得这些时,它们会根据方向正确切换(另一个谜)

编辑:这似乎可以连接到另一个错误,其中 *** 作系统复制在库中拍摄的图像(它只应该将图像保存在我们指定的URL中),事实是图库中的这个图像具有ORIENTATION信息而指定位置的那个没有.

这是错误; http://code.google.com/p/android/issues/detail?id=19268

编辑2:我已经向AndroID提交了一个新的错误.我很确定这是与上述错误相关的 *** 作系统错误.
http://code.google.com/p/android/issues/detail?id=22822

解决方法:

好吧,看起来这个AndroID的BUG将暂时无法修复.虽然我找到了一种方法来实现Exifinformation,以便两个设备(具有正确的Exif标签,以及不正确的exif标签一起工作).

所以问题出在一些(较新的)设备上,有一个错误,使得拍摄的照片保存在您的app文件夹中而没有正确的exif标签,而正确旋转的图像保存在androID默认文件夹中(即使它不应该). .

现在我做的是,我记录我从我的应用程序启动相机应用程序的时间.在活动结果上,我查询媒体提供商,看看在我保存的这个时间戳之后是否保存了任何图片.这意味着,很可能 *** 作系统将正确旋转的图片保存在默认文件夹中,当然在媒体商店中放入一个条目,我们可以使用此行中的轮换信息.现在为了确保我们正在查看正确的图像,我将此文件的大小与我有权访问的文件(保存在我自己的应用程序文件夹中)进行比较;

    int rotation =-1;    long fileSize = new file(filePath).length();    Cursor mediaCursor = content.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Images.ImageColumns.ORIENTATION, MediaStore.MediaColumns.SIZE }, MediaStore.MediaColumns.DATE_ADDED + ">=?", new String[]{String.valueOf(captureTime/1000 - 1)}, MediaStore.MediaColumns.DATE_ADDED + " desc");    if (mediaCursor != null && captureTime != 0 && mediaCursor.getCount() !=0 ) {        while(mediaCursor.movetoNext()){            long size = mediaCursor.getLong(1);            //Extra check to make sure that we are getting the orIEntation from the proper file            if(size == fileSize){                rotation = mediaCursor.getInt(0);                break;            }        }    }

现在,如果此时的旋转仍为-1,那么这意味着这是具有正确旋转信息的手机之一.此时,我们可以在返回到onActivityResult的文件上使用常规exif方向

    else if(rotation == -1){        rotation = getExifOrIEntationAttribute(filePath);    }

您可以在这个问题Camera orientation issue in Android中轻松找到如何找到exif方向,如答案

另请注意,只有在API等级5之后才支持ExifInterface.因此,如果您想在2.0之前支持手机,那么您可以使用我找到的这个方便的库,用于Java提供的Drew Noakes; http://www.drewnoakes.com/code/exif/

祝你的形象旋转好运!

编辑:因为有人问,我使用的意图和我的开始是这样的

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//mediafile is where the image will be savedintent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromfile(mediafile));startActivityForResult(intent, 1);
总结

以上是内存溢出为你收集整理的android – 使用ACTION_IMAGE_CAPTURE拍摄的图像在某些Gingerbread设备上的ExifInterface.TAG_ORIENTATION返回1全部内容,希望文章能够帮你解决android – 使用ACTION_IMAGE_CAPTURE拍摄的图像在某些Gingerbread设备上的ExifInterface.TAG_ORIENTATION返回1所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1104067.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存