Android 初始化摄影机对象时,摄影机对象的某些时间为空

Android 初始化摄影机对象时,摄影机对象的某些时间为空,android,camera,android-camera,Android,Camera,Android Camera,我正试图实现我自己的相机与碎片。一切都进行得很顺利,但最近我在谷歌开发者控制台看到崩溃报告,相机初始化时为空。下面是我在应用程序中初始化相机的代码 /** A safe way to get an instance of the Camera object. */ public static Camera getCameraInstance(int cameraType) { Camera c = null; try { c = Camera.open(camer

我正试图实现我自己的相机与碎片。一切都进行得很顺利,但最近我在谷歌开发者控制台看到崩溃报告,相机初始化时为空。下面是我在应用程序中初始化相机的代码

/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(int cameraType) {
    Camera c = null;
    try {
        c = Camera.open(cameraType);
    } catch (Exception e) {
        e.printStackTrace();

    }
    return c; // returns null if camera is unavailable
}
上面的代码是谷歌开发者在他们的博客上推荐的。Look camera可能会返回null,在这种情况下,我会在某些时候(并非总是)将camera对象设置为null。所以我的问题是,如何正确初始化相机以避免出现空值

注意:我关注了android开发者的博客,我以以下方式发布了暂停时的相机资源

@Override
public void onPause() {
    // free up camera so that other program can use it
    if (camera != null) {
        camera.stopPreview();
        camera.release();
        paused = true;
    }

    // getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    // // set the activity back to //whatever it needs to be when going
    // back.
    super.onPause();
}
我正在按以下方式初始化onResume中的相机

@Override
public void onResume() {
    // resume camera
    if (paused) {
        paused = false;
        try {
            initCamera();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    super.onResume();
}

有人能告诉我为什么在某些罕见的情况下会得到空的摄影机对象吗?

如果函数
camera.open(cameraType)
返回null,这是因为相机已经在使用中,或者它不存在。 因此,我认为当闪光灯应用程序使用相机时,或者如果其他应用程序没有正确关闭相机时,会出现此错误


在完成此活动之前,您需要调用
mCamera.release()

当相机为空时,有两个选项:

  • 相机正在被另一个进程使用。你唯一能做的就是通知用户相机已经在使用了

  • Android设备没有摄像头,您可以通过在清单中添加以下内容来解决此问题:

  • 这一点也得到了政府的证实

    最后一点注意:“摄影机正被另一个进程使用”的情况实际上是一个非常常见的情况,在以下场景中可能会发生

  • 另一个摄像头应用程序的“淘气”开发人员在其应用程序进入后台时没有正确释放摄像头资源
  • 某些应用确实需要保持相机资源处于使用状态,例如手电筒应用(尝试启用手电筒,然后打开默认的相机应用)

  • 是的,文件上的内容完全相同,但我得到的是空值。有没有办法检查哪个应用程序正在使用摄像头硬件?如果发现这种情况,我们是否可以释放摄像头资源@AlonsoFloo绝对不是,只有打开它的应用程序才能关闭它:除了@AlonsoFloo的答案外,只要摄像头返回null,你就可以向应用程序用户显示一个错误提示,而不是让应用程序崩溃。嘿@jsmols我知道这可能是因为提到的原因。我正在寻找可靠的解决方案或建议。无论如何,我已经按照你上面提到的方式添加了权限。你们有更多关于解决方案的提示吗?你的解释无处不在。不管怎样,谢谢你的关注,我认为你实际上能做的不多了。当相机被另一个进程使用时,这就有点结束了……不应该有这种情况,不是吗?这种情况是如何发生的?我还有一个开源项目,如果您愿意,它可以为您提供另一个示例实现:。看看录像机。initializeCameraAndPreview(),我向用户敬酒,并在无法打开相机时关闭应用程序。仅供参考:您使用和释放相机资源的代码是正确的