打开相机返回null(RuntimeException:无法连接到相机服务)

时间:2014-05-09 13:41:16

标签: android camera

我尝试打开前置摄像头,但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(相机,record_audio,record_video)中的权限以及使用功能(相机和相机前端)

  2. 相机已正确关闭(停止(),重置(),停止预览(),释放())

  3. 在单独的应用程序中实现服务。这是有效的,但我希望它与活动“脱离”我无法进入活动并从那里启动相机。我更喜欢它从我的Recorder.java开始,它应该很容易实现到你的应用程序中进行用户测试......

  4. 我怀疑可能是SurfaceHolder阻碍了我。是否可以在不处理活动中的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;
    }
    

1 个答案:

答案 0 :(得分:0)

在您的日志中

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

将其更改为

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

我想你会明白答案。 是否会为camIdx = 0抛出异常?

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