@@ -149,8 +149,22 @@ public void start() {
149149 throw new RuntimeException ("Missing camera permission" );
150150 }
151151
152- startRequested = true ;
153- startIfRequested ();
152+ backgroundHandler .post (new Runnable () {
153+ @ Override
154+ public void run () {
155+ startRequested = true ;
156+ startIfRequestedAsync ();
157+ }
158+ });
159+ }
160+
161+ private void startIfRequestedAsync (){
162+ backgroundHandler .post (new Runnable () {
163+ @ Override
164+ public void run () {
165+ startIfRequested ();
166+ }
167+ });
154168 }
155169
156170 /**
@@ -160,10 +174,15 @@ public void pause() {
160174 isPaused = true ;
161175
162176 if (running ) {
177+ backgroundHandler .removeCallbacksAndMessages (null );
163178 isProcessing = false ;
164-
165- camera .stopPreview ();
166- decodeEnabled = false ;
179+ backgroundHandler .post (new Runnable () {
180+ @ Override
181+ public void run () {
182+ camera .stopPreview ();
183+ decodeEnabled = false ;
184+ }
185+ });
167186 }
168187 }
169188
@@ -176,22 +195,31 @@ public void resume() {
176195 if (!running ) {
177196 start ();
178197 } else {
179- // as stated in the documentation:
180- // focus parameters may not be preserved across preview restarts
181- Camera . Parameters parameters = camera . getParameters ();
182- chooseFocusMode ( parameters );
183- camera . setParameters ( parameters ) ;
184- camera . startPreview ();
198+ backgroundHandler . post ( new Runnable () {
199+ @ Override
200+ public void run () {
201+ if (! running ){
202+ return ;
203+ }
185204
186- clearBuffers ();
187- decodeEnabled = true ;
205+ // as stated in the documentation:
206+ // focus parameters may not be preserved across preview restarts
207+ Camera .Parameters parameters = camera .getParameters ();
208+ chooseFocusMode (parameters );
209+ camera .setParameters (parameters );
210+ camera .startPreview ();
188211
189- synchronized (frameBufferLock ) {
190- // some Samsung devices are sometimes unregistering the preview callback
191- // when calling stopPreview, so we are registering it here again
192- camera .setPreviewCallbackWithBuffer (BarcodeScannerView .this );
193- camera .addCallbackBuffer (backBuffer );
194- }
212+ clearBuffers ();
213+ decodeEnabled = true ;
214+
215+ synchronized (frameBufferLock ) {
216+ // some Samsung devices are sometimes unregistering the preview callback
217+ // when calling stopPreview, so we are registering it here again
218+ camera .setPreviewCallbackWithBuffer (BarcodeScannerView .this );
219+ camera .addCallbackBuffer (backBuffer );
220+ }
221+ }
222+ });
195223 }
196224 }
197225
@@ -304,6 +332,9 @@ private void startIfRequested() {
304332 // extra buffer that will be used for image rotations
305333 rotateBuffer = new byte [bufferSize ];
306334
335+ camera .setPreviewCallbackWithBuffer (this );
336+ camera .addCallbackBuffer (backBuffer );
337+
307338 if (manualAutoFocus ) {
308339 scheduleAutoFocus ();
309340 }
@@ -318,10 +349,13 @@ private void startIfRequested() {
318349 isProcessing = false ;
319350
320351 setTorchEnabled (torchEnabled );
321- updateTransform ();
322352
323- camera .setPreviewCallbackWithBuffer (this );
324- camera .addCallbackBuffer (backBuffer );
353+ mainThreadHandler .post (new Runnable () {
354+ @ Override
355+ public void run () {
356+ updateTransform ();
357+ }
358+ });
325359
326360 if (isPaused ) {
327361 camera .stopPreview ();
@@ -371,13 +405,18 @@ private void chooseFocusMode(Camera.Parameters parameters) {
371405 }
372406
373407 private void showError (final boolean show ) {
374- if (show ) {
375- cameraUnavailableView .setVisibility (View .VISIBLE );
376- scanIndicatorView .setVisibility (View .GONE );
377- } else {
378- cameraUnavailableView .setVisibility (View .GONE );
379- scanIndicatorView .setVisibility (View .VISIBLE );
380- }
408+ mainThreadHandler .post (new Runnable () {
409+ @ Override
410+ public void run () {
411+ if (show ) {
412+ cameraUnavailableView .setVisibility (View .VISIBLE );
413+ scanIndicatorView .setVisibility (View .GONE );
414+ } else {
415+ cameraUnavailableView .setVisibility (View .GONE );
416+ scanIndicatorView .setVisibility (View .VISIBLE );
417+ }
418+ }
419+ });
381420 }
382421
383422 /**
@@ -399,7 +438,8 @@ public void setTorchEnabled(boolean enabled) {
399438 parameters .setFlashMode (Camera .Parameters .FLASH_MODE_OFF );
400439 }
401440 }
402-
441+ startRequested = true ;
442+ startIfRequestedAsync ();
403443 try {
404444 camera .setParameters (parameters );
405445 torchEnabled = enabled ;
@@ -504,19 +544,24 @@ public void removeBarcodeFormat(BarcodeFormat format) {
504544 }
505545
506546 public void stop () {
507- if (running ) {
508- camera .stopPreview ();
509- camera .release ();
510- camera = null ;
511- running = false ;
512- }
547+ backgroundHandler .post (new Runnable () {
548+ @ Override
549+ public void run () {
550+ if (running ) {
551+ camera .stopPreview ();
552+ camera .release ();
553+ camera = null ;
554+ running = false ;
555+ }
513556
514- startRequested = false ;
557+ startRequested = false ;
558+ }
559+ });
515560 }
516561
517562 @ Override
518563 public void onSurfaceTextureAvailable (SurfaceTexture surface , int width , int height ) {
519- startIfRequested ();
564+ startIfRequestedAsync ();
520565
521566 surfaceWidth = width ;
522567 surfaceHeight = height ;
@@ -563,6 +608,7 @@ public void onPreviewFrame(byte[] data, final Camera camera) {
563608 }
564609
565610 swapBuffers ();
611+
566612 camera .addCallbackBuffer (backBuffer );
567613
568614 isProcessing = true ;
0 commit comments