Android相机意图和方向的问题

3
当我在我的Android应用程序中启动相机意图时,遇到了以下问题:如果应用程序以一种方向(比如纵向)启动,则相机仅在该方向中工作。如果您在应用程序运行或相机意图运行时更改手机方向为横向,并尝试拍摄横向照片,则应用程序会强制关闭并出现错误。就好像相机意图只能在启动应用程序时的方向中拍摄一样。
只有当我以横向开始我的应用程序时,才能在横向拍摄照片,只有当我以纵向开始时,才能在纵向拍摄照片。启动相机意图的代码非常简单:
        String path = (new StringBuilder()).append(Environment.getExternalStorageDirectory()).append("/"+fileName).toString();
        File file = new File(path);
        Uri outputFileUri = Uri.fromFile(file);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra("output", outputFileUri);
        startActivityForResult(intent, CAMERA_RESULT);

有任何想法为什么会发生这种情况?我在清单文件中没有与摄像头方向相关的内容...
祝好,
Aram

你解决了这个问题吗?请分享代码。http://developer.android.com/training/camera/photobasics.html Android开发网站上给出的示例似乎对我无效!! - nia
6个回答

5
我通过在调用相机的活动中添加configChanges="orientation"解决了这个问题。希望能对你有所帮助 :)

1
答案需要更多的解释。 - metis

1

大多数手机相机都是横向的,这意味着如果您以纵向拍摄照片,则生成的照片将旋转90度。在这种情况下,相机软件应该使用应该查看照片的方向填充EXIF数据。

ExifInterface ei = new ExifInterface(photoPath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

switch(orientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
        rotateImage(bitmap, 90);
        break;
    case ExifInterface.ORIENTATION_ROTATE_180:
        rotateImage(bitmap, 180);
        break;
    // etc.
}

这里是rotateImage方法:
public static Bitmap rotateImage(Bitmap source, float angle) {
    Bitmap retVal;

    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    retVal = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);

    return retVal;
}

看起来您可能正在丢弃包含实际旋转的位图的rotateImage的返回值。 :-) - Tormod Haugene

0

我认为问题在于outputFileUri值一旦活动的方向改变就会变为空。

我通过像这样为变量添加保存的实例状态来解决了这个问题:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if(outputFileUri!=null) {
        outState.putString("outputFileUri", outputFileUri.toString());
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    outputFileUri = Uri.parse(savedInstanceState.getString("outputFileUri"));
}

希望这能帮助到遇到这个问题的任何人!

0
我认为问题出在你的onActivityResult函数上。如果你在竖屏模式下启动相机意图,然后尝试旋转屏幕并拍摄横向照片,当你的第一个活动恢复时,它会丢失你想要拍摄的outputFileUri,并将其设置为null,抛出NullPointerException错误。

3
这个问题的解决方案是什么?:( - nia

0

大家好,这是对我有效的一些东西。在Android开发者中,他们已经在ResultOK块内给出了检查data!= null的方法,但如果您将其更改为fileUri!= null,则可以正常工作,并且稍后在保存文件时应该用fileUri替换data.getData(),它也会保存图像。希望这有所帮助。


0

在activity标签中添加以下内容(AndroidManifest.xml)

android:configChanges="orientation|keyboardHidden"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接