gpt4 book ai didi

android - 在某些 Gingerbread 设备上,使用 ACTION_IMAGE_CAPTURE 拍摄的图像对于 ExifInterface.TAG_ORIENTATION 始终返回 1

转载 作者:IT王子 更新时间:2023-10-29 00:01:43 26 4
gpt4 key购买 nike

我在使用 ACTION_IMAGE_CAPTURE Activity 时遇到了方向问题。我使用了 TAG_ORIENTATION 以便相应地旋转图片。但是现在我们发现在一些较新的设备上这不起作用。事实上,它对所有方向都返回 1。

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

  • 三星 Infuse 4G (2.3.3)
  • 三星 Galaxy SII X (2.3.5)
  • 索尼 Xperia Arc (2.3.3)

有趣的是,一旦这张图片是画廊,它就会正确显示,如果我选择它,TAG_ORIENTATION 会正确填充。因此,OS 以某种方式正确填写了此信息,但未在 ActivityResult 上填写。

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

编辑:似乎这可能与另一个错误有关,在该错误中操作系统复制了在画廊中拍摄的图像(它只应该将图像保存在我们指定的 URL 中),问题是画廊中的这张图片有ORIENTATION 信息,而指定位置的则没有。

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

EDIT-2:我提交了一个新的 Android 错误。我很确定这是与上述错误相关的操作系统错误。 http://code.google.com/p/android/issues/detail?id=22822

最佳答案

好的,伙计们,看来这个 android 的 bug 暂时不会修复。虽然我找到了一种实现 ExifInformation 的方法,以便两个设备(具有正确 Exif 标签的设备和不正确的 exif 标签一起工作)..

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

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

    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);
}

您可以轻松了解如何查找 exif 方向,如本问题 Camera orientation issue in Android 中的答案。

还要注意,ExifInterface 仅在 Api 级别 5 之后才受支持。因此,如果您想支持 2.0 之前的手机,那么您可以使用我为 Java 找到的这个方便的库,由 Drew Noakes 提供; http://www.drewnoakes.com/code/exif/

祝你的图片旋转好运!

编辑:因为被问到了,所以我使用的 Intent 和开始的方式是这样的

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//mediaFile is where the image will be saved
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile));
startActivityForResult(intent, 1);

关于android - 在某些 Gingerbread 设备上,使用 ACTION_IMAGE_CAPTURE 拍摄的图像对于 ExifInterface.TAG_ORIENTATION 始终返回 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8450539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com