Android 安卓摄像头意图问题&;方向

Android 安卓摄像头意图问题&;方向,android,camera,orientation,Android,Camera,Orientation,在我的Android应用程序中启动camera intent时,我遇到了以下问题:如果应用程序是以方向(例如,Scripte)启动的,那么摄像头只能在Scripte中工作。如果在应用程序运行或照相机运行的情况下,将手机方向更改为横向,并尝试拍摄横向照片,则应用程序强制关闭并出错。这就好像照相机只能在应用程序启动时的方向上拍摄一样 只有当我在横向中启动我的应用程序时,我才能在横向中拍照;只有在portait中启动应用程序时,我才能在纵向中拍照。启动照相机意图的代码非常简单: Str

在我的Android应用程序中启动camera intent时,我遇到了以下问题:如果应用程序是以方向(例如,Scripte)启动的,那么摄像头只能在Scripte中工作。如果在应用程序运行或照相机运行的情况下,将手机方向更改为横向,并尝试拍摄横向照片,则应用程序强制关闭并出错。这就好像照相机只能在应用程序启动时的方向上拍摄一样

只有当我在横向中启动我的应用程序时,我才能在横向中拍照;只有在portait中启动应用程序时,我才能在纵向中拍照。启动照相机意图的代码非常简单:

        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

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

我通过放置
configChanges=“orientation”解决了这个问题
在调用摄像机的活动中。希望这能有所帮助:)

好的,各位,这里有一些对我有用的东西。在android开发人员中,他们在ResultOK块中提供了检查数据=null,但如果您使用fileUri更改它=null,它可以正常工作,稍后在保存文件时,还应该用fileUri替换data.getData(),并保存图像。希望这能有所帮助。

大多数手机摄像头都是横向的,这意味着如果你拍的是纵向的照片,拍摄出来的照片会旋转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;
}

我认为问题在于一旦活动的方向改变,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"));
}

希望这能帮助任何人解决这个问题

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


android:configChanges=“orientation | keyboardHidden”

这个问题的解决方案是什么:(你找到解决方案了吗?请分享代码。android开发网站上给出的示例似乎对我不起作用!!似乎你可能会放弃包含实际旋转位图的
rotateImage
的返回值。:-)答案需要更多解释。