ursus
09/05/2018, 10:09 PM1fun start() : Observable {
Observable
.fromCallable { cameraId }
.flatMap { openCameraObservable(cameraManager, it) }
.filter { it is CameraOpenEvent.Opened }
.flatMap { createCaptureSessionObservable(it.cameraDevice, surfaceTexture) }
.filter { it is CaptureSessionEvent.Configured }
}
fun stop() {
// session?.close()
// session = null
//
// camera?.close()
// camera = null
}
private fun openCameraObservable(cameraManager: CameraManager, cameraId: String): Observable<CameraOpenEvent> {
return Observable.create { emitter ->
try {
var _camera: CameraDevice? = null
cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
override fun onOpened(camera: CameraDevice) {
_camera = camera
if (!emitter.isDisposed) emitter.onNext(CameraOpenEvent.Opened(camera))
}
override fun onClosed(camera: CameraDevice) {
_camera = camera
if (!emitter.isDisposed) {
emitter.onNext(CameraOpenEvent.Closed(camera))
emitter.onComplete()
}
}
override fun onDisconnected(camera: CameraDevice) {
_camera = camera
if (!emitter.isDisposed) {
emitter.onNext(CameraOpenEvent.Disconnected(camera))
emitter.onComplete()
}
}
override fun onError(camera: CameraDevice, error: Int) {
_camera = camera
if (!emitter.isDisposed) {
emitter.onError(IllegalStateException("Camera opening failed. Error code $error"))
}
}
}, null)
emitter.setCancellable { _camera?.close() }
} catch (ex: CameraAccessException) {
if (!emitter.isDisposed) emitter.onError(ex)
}
}
}