Android Zxing库不使用flash

时间:2018-02-01 08:30:23

标签: android android-camera barcode-scanner

我在我的应用程序中使用zxing库处理条码扫描程序。 我添加了闪光开/关功能到条形码扫描仪活动。 不幸的是,当我开启闪光灯时,应用程序会崩溃。

public void requestAutoFocus(Handler handler, int message) {
   if (camera != null && previewing) {
     autoFocusCallback.setHandler(handler, message);
     // Log.d(TAG, "Requesting auto-focus callback");
     camera.autoFocus(autoFocusCallback);  // <<<<<<< dead here
   }
}

*********错误日志************************************ ******

java.lang.RuntimeException: autoFocus failed
at android.hardware.Camera.native_autoFocus(Native Method)                            
at android.hardware.Camera.autoFocus(Camera.java:1297)
at com.google.zxing.client.android.camera.CameraManager.requestAutoFocus(CameraManager.java:222)                                                                        
at com.google.zxing.client.android.CaptureActivityHandler.handleMessage(CaptureActivityHandler.java:75)                                                     
at android.os.Handler.dispatchMessage(Handler.java:102)                                              
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6646)                                                                        
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)                                                                        
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

如果闪光灯开启,我会阻止对焦代码, 如下,

 public void requestAutoFocus(Handler handler, int message) {
   if (isFlashOn) return;  // <<<<<<< prevent here

   if (camera != null && previewing) {
     autoFocusCallback.setHandler(handler, message);
     //Log.d(TAG, "Requesting auto-focus callback");
     camera.autoFocus(autoFocusCallback);  
   }
 }

然后,它没有崩溃,但相机预览很冷。

logcat日志如下。

I/Choreographer: Skipped 38 frames!  The application may be doing too much work on its main thread.
E/Camera: Error 2

闪光灯打开/关闭代码,如下所示。

private void setFlash(boolean turnOn) {
    Camera camera;
    if (turnOn) {

      camera = CameraManager.get().getCamera().open();
      Camera.Parameters p = camera.getParameters();
      p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
      camera.setParameters(p);
      camera.startPreview();
    } else {

      camera = CameraManager.get().getCamera().open();
      Camera.Parameters p = camera.getParameters();
      p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
      camera.setParameters(p);
      camera.stopPreview();
    }
  }

请帮帮我....

3 个答案:

答案 0 :(得分:0)

将以下代码添加到AndroidManifest.xml文件中以使用相机

 <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

答案 1 :(得分:0)

让我们解决第一个问题:你调用autoFocus()并且它失败了。好的,这可能发生。即使你做的一切正确,但是你的相机调用不可避免地会抛出一个RuntimeException。您可以在try … catch中包含所有这些呼叫,并优雅地继续您正在做的任何事情,即使呼叫失败。

答案 2 :(得分:0)

希望您使用的是以下库

implementation 'com.google.zxing:core:3.4.0'
implementation 'com.journeyapps:zxing-android-embedded:4.0.0'

如果您使用的是DecoratedBarcodeView,则可以实现以下Flash选项

<com.journeyapps.barcodescanner.DecoratedBarcodeView
                android:id="@+id/barcodeView"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

在活动或片段中创建一个成员变量以跟踪闪存状态

private var isFlashOn = false

初始化条形码视图并设置割炬监听器

barcodeView = rootView.findViewById(R.id.barcodeView)
barcodeView.setStatusText("")

barcodeView.setTorchListener(this)

iv_flash_toggle.setOnClickListener{
    toggleFlash(!isFlashOn)
}

确保您的活动或片段实现以下两种方法。更新成员变量以跟踪是否打开或关闭闪光灯

override fun onTorchOff() {
    isFlashOn = false
}

override fun onTorchOn() {
    isFlashOn = true
}

希望这会有所帮助,快乐编码:)