2016-10-22 17 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はまだループしており、例外が発生します。場合によっては、例外がカメラがすでに閉じているとか、時にはnullポインタを取得しようとしていることがあります。

私は、それぞれの写真の撮影後にカメラが閉じて、カメラへの新しいポインタを作成すると思います。

どのように停止するのですか?

答えて

0

Cameraの代わりにCameraCaptureSessionを閉じる必要があります。 cameraCaptureSessions.close()

これで、新しいセッションを作成できます。

CameraCaptureSessionを閉じたときにカメラがnullであるため、例外が発生しました。

+0

文法を少し修正しました。これが意図された意味であるかどうかを教えてください。 – jdv

+0

はい、それは大丈夫です。ありがとう –

関連する問題