在前置摄像头上使用Camera.TakePicture会导致手机崩溃

时间:2014-07-23 17:04:56

标签: java android android-camera

我正在制作一个简单的应用程序,让用户可以拍摄自己的照片,然后对图像进行修改。这一直在精彩地工作,但现在突然试图拍照导致整个手机崩溃。

我能够解决问题的唯一方法。问题一直在变化:

mCamera = Camera.open(1);

为:

mCamera = Camera.open();

这对我来说没有意义,因为Camera.open(1)在应用程序的整个生命周期中一直运行良好。使用时手机甚至会崩溃:

mCamera.takePicture(null, null, null); //Useless I know. Just for test purposes.

最糟糕的是,由于整个手机崩溃并重新启动,我无法获得问题的logcat。如果我尝试在模拟器中运行它,它运行得很好。即使有大量的搜索,我还没有发现任何有相机api的人导致整个手机崩溃。

所以我想我的问题是,是否有人知道可能导致这种情况的原因是什么?或者我可能会开始寻找解决方法吗?

编辑: 我应该补充一点,我也尝试过使用:

int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
    Camera.getCameraInfo(camIdx, cameraInfo);
    if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        try {
            mCamera = Camera.open(camIdx);
        } catch (RuntimeException e) {
            Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
        }
    }
}

这也开启了前置摄像头并允许我预览,与mCamera = Camera.open(1)相同;但拍照时手机仍然会崩溃。

2 个答案:

答案 0 :(得分:0)

首先检查您的手机camera是否正在传递。这是获取后置摄像头ID的辅助方法。

public int getCamera() 
{ 
    int numCameras = Camera.getNumberOfCameras(); 
    CameraInfo cameraInfo = new CameraInfo(); 
    for (int i = 0; i < numCameras; i++) 
    { 
        Camera.getCameraInfo(i, cameraInfo); 
        if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) 
        { 
            return i; 
        }
    } 
    return -1; 
} 

答案 1 :(得分:0)

嗯,这是代码的一个主要问题,你正在硬编码一个摄像机ID,而且这个炸弹会随时爆炸,而你必须做以下事情:

你需要使用 http://developer.android.com/reference/android/hardware/Camera.html查看它是否有多个摄像头,并查询CameraInfo

getNumberOfCameras

getCameraInfo

并使用常量

  

int CAMERA_FACING_BACK相机的朝向与屏幕相反。

     

int CAMERA_FACING_FRONT摄像机的朝向与屏幕相同。

获得所需相机的信息后,必须使用其提供的任何ID来打开相机。

这样的事情:

int cameraId = -1;
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i < numberOfCameras; i++) {
  CameraInfo info = new CameraInfo();
  Camera.getCameraInfo(i, info);
  if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
    Log.d(DEBUG_TAG, "Camera found");
    cameraId = i;
    break;
  }
}

希望它有所帮助!

问候!