0

Я использую сканер штрих-кода в своем приложении. В некоторых мобильных устройствах это исключает исключение во время выполнения. Невозможно подключиться к камере.Исключение времени выполнения Не удается подключиться к камере Обслуживание в некоторых устройствах

Вот код, я использую для камеры

/** 
* Opens the camera and applies the user settings. 
* 
* @throws RuntimeException if the method fails 
*/ 
@SuppressLint("InlinedApi") 
private Camera createCamera() { 
    int requestedCameraId = getIdForRequestedCamera(mFacing); 
    if (requestedCameraId == -1) { 
     throw new RuntimeException("Could not find requested camera."); 
    } 
    Camera camera = Camera.open(requestedCameraId); 

    SizePair sizePair = selectSizePair(camera, mRequestedPreviewWidth, mRequestedPreviewHeight); 
    if (sizePair == null) { 
     throw new RuntimeException("Could not find suitable preview size."); 
    } 
    Size pictureSize = sizePair.pictureSize(); 
    mPreviewSize = sizePair.previewSize(); 

    int[] previewFpsRange = selectPreviewFpsRange(camera, mRequestedFps); 
    if (previewFpsRange == null) { 
     throw new RuntimeException("Could not find suitable preview frames per second range."); 
    } 

    Camera.Parameters parameters = camera.getParameters(); 

    if (pictureSize != null) { 
     parameters.setPictureSize(pictureSize.getWidth(), pictureSize.getHeight()); 
    } 

    parameters.setPreviewSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
    parameters.setPreviewFpsRange(
      previewFpsRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX], 
      previewFpsRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]); 
    parameters.setPreviewFormat(ImageFormat.NV21); 

    setRotation(camera, parameters, requestedCameraId); 

    if (mFocusMode != null) { 
     if (parameters.getSupportedFocusModes().contains(
       mFocusMode)) { 
      parameters.setFocusMode(mFocusMode); 
     } else { 
      Log.i(TAG, "Camera focus mode: " + mFocusMode + " is not supported on this device."); 
     } 
    } 

    // setting mFocusMode to the one set in the params 
    mFocusMode = parameters.getFocusMode(); 

    if (mFlashMode != null) { 
     if (parameters.getSupportedFlashModes() != null) { 
      if (parameters.getSupportedFlashModes().contains(
        mFlashMode)) { 
       parameters.setFlashMode(mFlashMode); 
      } else { 
       Log.i(TAG, "Camera flash mode: " + mFlashMode + " is not supported on this device."); 
      } 
     } 
    } 

    // setting mFlashMode to the one set in the params 
    mFlashMode = parameters.getFlashMode(); 

    camera.setParameters(parameters); 

    // Four frame buffers are needed for working with the camera: 
    // 
    // one for the frame that is currently being executed upon in doing detection 
    // one for the next pending frame to process immediately upon completing detection 
    // two for the frames that the camera uses to populate future preview images 
    camera.setPreviewCallbackWithBuffer(new CameraPreviewCallback()); 
    camera.addCallbackBuffer(createPreviewBuffer(mPreviewSize)); 
    camera.addCallbackBuffer(createPreviewBuffer(mPreviewSize)); 
    camera.addCallbackBuffer(createPreviewBuffer(mPreviewSize)); 
    camera.addCallbackBuffer(createPreviewBuffer(mPreviewSize)); 

    return camera; 
} 

    * Stops the camera. 
*/ 
@Override 
protected void onPause() { 
    super.onPause(); 
    if (mPreview != null) { 
     mPreview.stop(); 
    } 
} 

/** 
* Releases the resources associated with the camera source, the associated detectors, and the 
* rest of the processing pipeline. 
*/ 
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (mPreview != null) { 
     mPreview.release(); 
    } 

} 

    /** 
* Restarts the camera. 
*/ 
@Override 
protected void onResume() { 
    super.onResume(); 
     startCameraSource(); 
} 

Время работы исключение я получаю

java.lang.RuntimeException: Fail to connect to camera service 
at android.hardware.Camera.<init>(Camera.java:532) 
at android.hardware.Camera.open(Camera.java:360) 

Любая помощь Что касается этого вопроса, потому что в некоторых устройствах это работает, но в некоторых он не работает, я не могу решить проблему.

+0

В какой версии ОС вы используете приложение? – Piyush

+0

Я использую Android 6.0.1 – FiXiT

+0

Вызов Camera.open() выдает исключение, если камера уже используется другим приложением. – LvN

ответ

0

Всегда проверяйте, доступна ли камера или нет, прежде чем приступать к ее использованию.

private Camera mCamera;  
    /** 
    * Opens the camera and applies the user settings. 
    * 
    * @throws RuntimeException if the method fails 
    */ 
    @SuppressLint("InlinedApi") 
    private Camera createCamera() { 
     int requestedCameraId = getIdForRequestedCamera(mFacing); 
     if (requestedCameraId == -1) { 
      throw new RuntimeException("Could not find requested camera."); 
     } 

     if (mCamera != null){ 
      mCamera.release(); 
      mCamera = null; 
     } 

     mCamera= Camera.open(requestedCameraId); 

     if(camera == null){ 
      Toast.makeText(mContext, "Camera service is not available currently.", Toast.LENGTH_LONG.show())  
      } 
      //.... 
     } 
    } 

И relsease камеру перед onDestroy().

/** 
* Releases the resources associated with the camera source, the associated detectors, and the 
* rest of the processing pipeline. 
*/ 
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (mPreview != null) { 
     mPreview.release(); 
     mCamera.release(); 
     mCamera = null; 
} 
Смежные вопросы