Android相机意图和问题的问题取向

时间:2011-03-14 03:23:40

标签: android camera orientation

在我的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);

为什么会发生这种情况?我在清单中没有任何与相机方向相关的内容......

干杯

亚兰

6 个答案:

答案 0 :(得分:5)

我通过将configChanges="orientation"放入调用相机的活动中解决了这个问题。希望有所帮助:)

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

好的,大家,这里的东西对我有用。在Android开发人员中,他们已经在ResultOK块中给出了检查数据是否!= null但是如果你用fileUri!= null更改它,它工作正常,稍后在保存文件时应该用fileUri替换data.getData(),它也保存图像。希望这会有所帮助。

答案 4 :(得分:0)

我认为问题是,一旦活动的方向发生变化,outputFileUri值就会变为null。

我能够通过为变量添加已保存的实例状态来解决此问题,如下所示:

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

希望这可以帮助任何人解决这个问题!

答案 5 :(得分:0)

将其添加到活动标签 (AndroidManifest.xml) 中

android:configChanges="orientation|keyboardHidden"