在我的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);
为什么会发生这种情况?我在清单中没有任何与相机方向相关的内容......
干杯
亚兰
答案 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"