【问题标题】:Opening camera returns null (RuntimeException: Fail to connect to camera service)打开相机返回null(RuntimeException:连接相机服务失败)
【发布时间】:2014-05-09 13:41:16
【问题描述】:

我尝试打开前置摄像头,但 Camera.open(camId) 返回 null 并抛出异常 java.lang.RuntimeException: Fail to connect to camera service

我查看了类似的问题并尝试了在这些线程中发现的内容,但它似乎不适用于我的程序。我认为这可能与我尝试将相机作为一项服务运行而我不想要任何预览的事实有关。

这是我开始录制的方法:

Log.v(TAG, "Starting camera");
Intent intent = new Intent(getActivity(), RecorderService.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getActivity().startService(intent);

这是我的停止方法:

Log.v(TAG, "Stopping camera");
getActivity().stopService(new Intent(getActivity(), RecorderService.class));

在服务的 onStartCommand 方法中,我根据 Android 文档设置了所有设置。我已经使这个确切的代码在应用程序中工作,但是当我尝试通过在我的 Recorder.java 类中实现它来“分离”它时,我似乎无法解决我没有从活动中打开它的情况...

我尝试过的:

  1. Android Manifest 中的权限(camera、record_audio、record_video)以及使用功能(camera 和 camera.front)

  2. 相机已正确关闭(stop()、reset()、stopPreview()、release())

  3. 在单独的应用程序中实现服务。这可行,但因为我希望它与活动“分离”,所以我无法进入活动并从那里启动相机。我希望它从我的 Recorder.java 开始,它应该很容易实现到您的应用程序中以进行用户测试...

我怀疑可能是 SurfaceHolder 阻碍了我。是否可以在不处理Activity中的SurfaceViews和SurfaceHolders的情况下进行摄像头记录?

感谢您的帮助

更多代码(这是异常的来源):

private static Camera openFrontFacingCamera() {
    int cameraCount = 0;
    Camera cam = null;

    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();

    Log.v(TAG, "Number of cameras: " + cameraCount);

    for ( int camIdx = 0; camIdx < cameraCount; camIdx++ ) {

        Camera.getCameraInfo( camIdx, cameraInfo );

        if ( cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ) {

            try {

                cam = Camera.open( camIdx );

            } catch (Exception e){

                // Camera is not available (in use or does not exist)
                Log.d(TAG, "Camera did not open");
                Log.d(TAG, e.toString());
                e.printStackTrace();


            }
        }
    }

    return cam;
}

【问题讨论】:

    标签: android camera


    【解决方案1】:

    在你的日志中

    Log.d(TAG, "Camera did not open");
    

    改成

    Log.d(TAG, "Camera did not open, camId= "+camIdx);
    

    我想你会知道答案的。 camIdx = 0 会抛出异常吗?

    如果不是,那么我认为您的问题是您在开始 camIdx= 1 之前没有停止相机服务

    【讨论】:

    • 异常是从 camIdx = 1 引发的。我读到有人遇到问题,因为他们忘记停止和释放相机,相机只在第一次尝试时才工作。但是,我的相机根本不工作。我已经尝试过重启手机,以确保之前没有其他应用程序使用过相机。 openFrontFacingCamera 来自this SO thread 所以我不认为有什么问题吗?感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2017-10-29
    • 2018-03-12
    • 2018-02-09
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多