2016-10-22 38 views
1

我在下面有這樣的代碼。如何在Android 5.0 API 21上關閉相機?

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     context = getApplicationContext(); 

     openCamera(); 
} 

private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { 
     @Override 
     public void onOpened(CameraDevice camera) { 
      //This is called when the camera is open 
      Log.e(TAG, "onOpened"); 
      cameraDevice = camera; 
      createCameraPreview(); 
      //closeCamera(); 
     } 

     @Override 
     public void onDisconnected(CameraDevice camera) { 
      Log.e(TAG, "onDisconnected"); 
      //cameraDevice.close(); 
     } 

     @Override 
     public void onError(CameraDevice camera, int error) { 
      Log.e(TAG, "onError"); 
      cameraDevice.close(); 
      cameraDevice = null; 
     } 
    }; 

private void openCamera() { 
     manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
     Log.e(TAG, "is camera open"); 
     try { 
      cameraId = manager.getCameraIdList()[0]; 
      CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); 
      StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 
      assert map != null; 
      imageDimension = map.getOutputSizes(SurfaceTexture.class)[0]; 
      manager.openCamera(cameraId, stateCallback, null); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
     Log.e(TAG, "openCamera X"); 
    } 

private void closeCamera() { 
     Log.e(TAG, "closeCamera start"); 
     if (null != cameraDevice) { 
      cameraDevice.close(); 
      cameraDevice = null; 
     } 
     if (null != imageReader) { 
      imageReader.close(); 
      imageReader = null; 
     } 
    } 

protected void createCameraPreview() { 
     Log.e(TAG, "createCameraPreview start"); 
     if (null != cameraDevice) { 
      try { 
       SurfaceTexture texture = new SurfaceTexture(1); 
       assert texture != null; 
       texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight()); 
       Surface surface = new Surface(texture); 

       if (null == cameraDevice) { 
        Log.e(TAG, "cameraDevice is null"); 
        return; 
       } 

       captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
       captureRequestBuilder.addTarget(surface); 
      } catch (CameraAccessException e) { 
       e.printStackTrace(); 
      } 
      Log.e(TAG, "createCameraPreview exit"); 
      takePicture(); 
     } 

    } 

打開相機後,準備相機,然後拍照。但方法public void onOpened(CameraDevice camera);循環和相機每秒準備。那麼,如何關閉CameraManager來停止循環方法public void onOpened(CameraDevice camera);

如果我在拍攝照片後嘗試用方法private void closeCamera();關閉相機,CameraManager仍然有效,方法onOpened仍然循環並且出現異常。有時例外說相機已經關閉了,有時候我會試圖得到一個空指針。

我猜攝像機在每次拍攝後都會關閉並創建一個指向相機的新指針。

如何阻止它?

回答

0

您必須嘗試關閉CameraCaptureSession而不是Camera。你可以通過cameraCaptureSessions.close()

然後你可以創建一個新的會話。

您收到一個異常,因爲當您關閉CameraCaptureSession時,相機爲空。

+0

我修正了一下語法。讓我知道這是否是預期的意思。 – jdv

+0

是的,沒關係。謝謝 –