【问题标题】:Some of the time camera object is null while initializing it有时相机对象在初始化时为空
【发布时间】:2015-01-27 08:14:20
【问题描述】:

我正在尝试使用片段实现我自己的相机。一切进展顺利,但最近我在谷歌开发者控制台中看到了相机在初始化时为空的崩溃报告。这是我如何在我的应用程序中初始化相机的代码。

/** 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
}

以上代码是 Google 开发人员在其博客上推荐的。看相机可能会返回 null,这是我在某些时候(并非总是)得到相机对象 null 的情况。所以我的问题是,如何正确初始化相机以避免为空?

注意:我关注了 android dev 博客,我正在通过以下方式释放相机资源 onPause。

@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();
}

谁能告诉我为什么我在极少数情况下会得到空相机对象?

【问题讨论】:

  • 除了@AlonsoFloo 的回答之外,您可以在相机返回 null 时向应用用户显示错误 toast,而不是让应用崩溃。

标签: android camera android-camera


【解决方案1】:

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

您需要在此活动中拨打finish 之前拨打mCamera.release()

【讨论】:

  • 是的文件说的完全一样,但我得到了 null 。有什么方法可以检查哪个应用程序正在使用相机硬件?或者如果发现这种情况我们可以释放相机资源吗? @AlonsoFloo
  • 绝对不行,只有打开它的应用才能关闭它:s
【解决方案2】:

当相机为空时,有两种选择:

  1. 相机正被另一个进程使用。然后,您唯一能做的就是通知用户相机已在使用中。

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

    <uses-feature android:name="android.hardware.camera" android:required="true" />

Android developer docs也证实了这一点

最后说明:“相机正在被另一个进程使用”的情况其实是一种很常见的情况,可能会出现在以下场景中。

  1. 另一个相机应用程序的“顽皮”开发人员在他的应用程序进入后台时没有正确释放相机资源。
  2. 某些应用确实需要保持相机资源处于使用状态,例如手电筒应用(尝试启用您的手电筒,然后打开默认的相机应用)

【讨论】:

  • 嘿@jsmols 我知道这可能是由于提到的原因。我正在寻找可靠的解决方案或建议。无论如何,我已经按照您上面提到的方式添加了权限。您对解决方案有更多提示吗?您的解释无处不在。总之谢谢关注
  • 我认为您实际上不能做更多的事情。当相机被另一个进程使用时,这就是路的尽头......
  • 应该不会有这种情况吧?怎么会出现这种情况?
  • 我还有一个开源项目,如果你愿意,它可以为你提供另一个示例实现:github.com/jmolsmobile/LandscapeVideoCamera。查看 VideoRecorder.initializeCameraAndPreview(),我向用户敬酒并在无法打开相机时关闭应用程序。
  • 仅供参考:您使用和释放相机资源的代码是正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
相关资源
最近更新 更多