【问题标题】:Using Camera.TakePicture with Front Camera Causes Phone to Crash使用带前置摄像头的 Camera.TakePicture 导致手机崩溃
【发布时间】:2014-07-24 01:19:40
【问题描述】:

我正在开发一个简单的应用程序,它可以让用户为自己拍照,然后对图像进行修改。这一直工作得很好,但现在突然尝试拍照导致整个手机崩溃。

我能够“解决”这个问题的唯一方法是改变:

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); 相同但是拍照的时候还是会死机。

【问题讨论】:

  • Camera.open(int) 需要有效的相机 ID。 getNumberOfCameras() 告诉你什么?
  • 即使我面临同样的问题,但在我的情况下,应用程序冻结并且我收到错误 100 我已释放相机对象仍然遇到该错误 100
  • 你发现了吗?我有同样的问题。当我尝试拍照时,整个手机都会重新启动!!

标签: java android android-camera


【解决方案1】:

首先检查您的手机是否有您传递的camera id。这是获取后置摄像头 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; 
} 

【讨论】:

    【解决方案2】:

    好吧,代码有一个大问题,你在硬编码一个相机 ID,这是一个随时会爆炸的炸弹,你必须做以下事情:

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

    getNumberOfCameras

    获取相机信息

    并使用常量

    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;
      }
    }
    

    希望对你有帮助!

    问候!

    【讨论】:

    • 这段代码应该可以帮助你编程,现在你只需要确保你没有删除清单中的相机权限,你应该很高兴......
    • manifest 还有: 不幸的是手机仍然崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多