我在我的应用程序中使用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();
}
}
请帮帮我....
答案 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
}
希望这会有所帮助,快乐编码:)