Android 如何修复相机实例打开失败?

Android 如何修复相机实例打开失败?,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,经过这么长时间的斗争。我发现这个问题找不到解决办法。我有一个按钮点击的活动,它启动了一个片段,相机被打开。我遵循了这一点,还添加了用于创建带有错误日志的视图的代码 我已经添加了所有权限 public View onCreateView(布局、充气机、视图组容器、, Bundle savedInstanceState){ 视图=充气机。充气(R.layout.fragment\U扫描,容器,错误); 如果(选中CameraHardware(getActivity().getApplication

经过这么长时间的斗争。我发现这个问题找不到解决办法。我有一个按钮点击的活动,它启动了一个片段,相机被打开。我遵循了这一点,还添加了用于创建带有错误日志的视图的代码

我已经添加了所有权限

public View onCreateView(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\U扫描,容器,错误);
如果(选中CameraHardware(getActivity().getApplicationContext()){
getCameraInstance();
mCamera=getCameraInstance();
mPreview=新的CameraPreview(this.getActivity(),mCamera);
//container.addView(mPreview);-->删除此行
//添加这一行
FrameLayout preview=(FrameLayout)view.findviewbyd(R.id.camera\u preview);
preview.addView(mPreview);
}
//为该碎片膨胀布局
返回视图;

}
使用以下方法

android.hardware.Camera.open(int cameraId)
private int findFrontFacingCamera() {

    // Search for the front facing camera
    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) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}
您应该通过cameraId,如果您想要前摄像头Id,可以使用以下方法

android.hardware.Camera.open(int cameraId)
private int findFrontFacingCamera() {

    // Search for the front facing camera
    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) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}
private int findFrontFacingCamera(){
//搜索前向摄像头
int numberOfCameras=Camera.getNumberOfCameras();
对于(int i=0;i
如果其他应用程序打开同一个摄像头,这将引发RuntimeException。 使用完相机后,必须调用release(),否则相机将保持锁定状态,其他应用程序无法使用。 对于特定的硬件相机,应用程序一次只能有一个相机对象处于活动状态。
如果这不起作用,请告诉我。

使用以下方法

android.hardware.Camera.open(int cameraId)
private int findFrontFacingCamera() {

    // Search for the front facing camera
    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) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}
您应该通过cameraId,如果您想要前摄像头Id,可以使用以下方法

android.hardware.Camera.open(int cameraId)
private int findFrontFacingCamera() {

    // Search for the front facing camera
    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) {
            cameraId = i;
            cameraFront = true;
            break;
        }
    }
    return cameraId;
}
private int findFrontFacingCamera(){
//搜索前向摄像头
int numberOfCameras=Camera.getNumberOfCameras();
对于(int i=0;i
如果其他应用程序打开同一个摄像头,这将引发RuntimeException。 使用完相机后,必须调用release(),否则相机将保持锁定状态,其他应用程序无法使用。 对于特定的硬件相机,应用程序一次只能有一个相机对象处于活动状态。
如果这不起作用,请告诉我。

在更改相机的正面之前,请确保停止预览并释放相机。 若你们看到了后面的摄像头,并且立即调用set facing to camera并开始预览,它将抛出类似“无法连接摄像头服务”的错误

我在这里添加了停止和释放相机的功能

void stop() {
    Log.w(TAG,"stop");
    if (mCamera != null) {
        mCamera.stopPreview();
    }
    mShowingPreview = false;
    releaseCamera();
}


 private void releaseCamera() {
    Log.w(TAG,"releaseCamera");
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
        mCallback.onCameraClosed();
    }
}
将此函数放入camera1或camera2 api类中。 在更改和设置面之前,只需调用stop,如下面的代码所示

void setFacing(int facing) {
    Log.w(TAG,"setFacing: "+facing);
    if (mFacing == facing) {
        Log.w(TAG,"Same Facing return");
        return;
    }
    mFacing = facing;
    if (isCameraOpened()) {
        Log.w(TAG,"Camera is Opened");
        stop();
        start();
    }else{
        Log.w(TAG,"Camera is Not Opened");
    }
}

在更改摄影机的朝向之前,请确保停止预览并释放摄影机。 若你们看到了后面的摄像头,并且立即调用set facing to camera并开始预览,它将抛出类似“无法连接摄像头服务”的错误

我在这里添加了停止和释放相机的功能

void stop() {
    Log.w(TAG,"stop");
    if (mCamera != null) {
        mCamera.stopPreview();
    }
    mShowingPreview = false;
    releaseCamera();
}


 private void releaseCamera() {
    Log.w(TAG,"releaseCamera");
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
        mCallback.onCameraClosed();
    }
}
将此函数放入camera1或camera2 api类中。 在更改和设置面之前,只需调用stop,如下面的代码所示

void setFacing(int facing) {
    Log.w(TAG,"setFacing: "+facing);
    if (mFacing == facing) {
        Log.w(TAG,"Same Facing return");
        return;
    }
    mFacing = facing;
    if (isCameraOpened()) {
        Log.w(TAG,"Camera is Opened");
        stop();
        start();
    }else{
        Log.w(TAG,"Camera is Not Opened");
    }
}

为什么要调用
getCameraInstance()两次?在
onCreateView
中,我没有找到您。。你能解释一下为什么要调用
getCameraInstance()两次?在
onCreateView
中,我没有找到您。。你能详细说明消息ok cancel Method Not available吗?你能告诉我这不是问题吗?我没有使用marshmellow,我正在测试API 19和22。但我还是测试了它。无法检查,我将再次检查。我将等待@shivamListen我发现我的问题。我无法正确调用camera.open。因此,我直接调用了Camera.Open在我的oncreateview中,而不是调用Camera实例方法,我可以在我的应用程序中打开Camera.shoemessage ok cancel方法不可用请您确认这不是问题我没有使用marshmellow我正在API 19和22上测试。但我还是测试了它。无法检查,我将再次检查。我将等待@shivamListen我发现我的问题。我无法正确调用camera.open。因此,我直接在oncreateview中调用Camera.Open,而不是调用Camera实例方法,这样我就可以在应用程序中打开Camera。