Android之扫描二维码&开启闪光灯
2013-08-06 17:50
393 查看
在本人开发的Android项目中先加入了扫描二维码功能(google的zxing)
然后又有需求要在扫描二维码的同时,可以打开闪光灯……
如此一个身心健康的年轻程序员慢慢的走向了死亡…………开个玩笑
上篇文章就是先写了个开启闪光灯的操作
不过当集成到项目中的时候就Game Over了
不过不着急,程序员是干嘛的?不就是挑战错误嘛
先看看错误信息
通过提示信息,结合实际现象,进行分析,不难了解到错误的原因:
扫描二维码已经开启了相机操作,然后开启闪光灯又实例化了一个Camera对象
手机只有一个Camera,所以我们自己就不能通过Camera camera = Camera.open();方法获得Camera对象了。
查看zxing程序代码,有一个CameraManagement类,Camera的实例化与操作都在这个Management类中,所以在该类中提供获取Camera对象的方法:
然后再看扫描二维码的Activity中的方法:
如此,开启闪光灯的操作是成功了,不过关闭闪光灯的操作还是有问题……
我们需要修改surfaceDestroyed()方法:
如此,在二维码扫描Activity中添加开启/关闭闪光灯操作就完成了
该方法在eoe上已经与作者给出详细介绍了
http://www.eoeandroid.com/thread-235785-1-1.html
然后又有需求要在扫描二维码的同时,可以打开闪光灯……
如此一个身心健康的年轻程序员慢慢的走向了死亡…………开个玩笑
上篇文章就是先写了个开启闪光灯的操作
不过当集成到项目中的时候就Game Over了
不过不着急,程序员是干嘛的?不就是挑战错误嘛
先看看错误信息
08-06 17:34:29.257: E/AndroidRuntime(24294): FATAL EXCEPTION: main 08-06 17:34:29.257: E/AndroidRuntime(24294): java.lang.IllegalStateException: Could not execute method of the activity 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.view.View$1.onClick(View.java:2154) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.view.View.performClick(View.java:2538) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.view.View$PerformClick.run(View.java:9152) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.os.Handler.handleCallback(Handler.java:587) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.os.Handler.dispatchMessage(Handler.java:92) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.os.Looper.loop(Looper.java:130) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.app.ActivityThread.main(ActivityThread.java:3691) 08-06 17:34:29.257: E/AndroidRuntime(24294): at java.lang.reflect.Method.invokeNative(Native Method) 08-06 17:34:29.257: E/AndroidRuntime(24294): at java.lang.reflect.Method.invoke(Method.java:507) 08-06 17:34:29.257: E/AndroidRuntime(24294): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 08-06 17:34:29.257: E/AndroidRuntime(24294): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 08-06 17:34:29.257: E/AndroidRuntime(24294): at dalvik.system.NativeStart.main(Native Method) 08-06 17:34:29.257: E/AndroidRuntime(24294): Caused by: java.lang.reflect.InvocationTargetException 08-06 17:34:29.257: E/AndroidRuntime(24294): at java.lang.reflect.Method.invokeNative(Native Method) 08-06 17:34:29.257: E/AndroidRuntime(24294): at java.lang.reflect.Method.invoke(Method.java:507) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.view.View$1.onClick(View.java:2149) 08-06 17:34:29.257: E/AndroidRuntime(24294): ... 11 more 08-06 17:34:29.257: E/AndroidRuntime(24294): Caused by: java.lang.RuntimeException: Fail to connect to camera service 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.hardware.Camera.native_setup(Native Method) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.hardware.Camera.<init>(Camera.java:300) 08-06 17:34:29.257: E/AndroidRuntime(24294): at android.hardware.Camera.open(Camera.java:275) 08-06 17:34:29.257: E/AndroidRuntime(24294): at com.android.francis.application.MainActivity.mainHandler(MainActivity.java:69) 08-06 17:34:29.257: E/AndroidRuntime(24294): ... 14 more
通过提示信息,结合实际现象,进行分析,不难了解到错误的原因:
扫描二维码已经开启了相机操作,然后开启闪光灯又实例化了一个Camera对象
手机只有一个Camera,所以我们自己就不能通过Camera camera = Camera.open();方法获得Camera对象了。
查看zxing程序代码,有一个CameraManagement类,Camera的实例化与操作都在这个Management类中,所以在该类中提供获取Camera对象的方法:
public Camera getCamera() { return camera; }
然后再看扫描二维码的Activity中的方法:
private Camera camera; private void turnHandler() { if (camera == null) { // camera = Camera.open(); camera = CameraManager.get().getCamera(); } camera.startPreview(); Parameters parameters = camera.getParameters(); // 判断闪光灯当前状态 if (Parameters.FLASH_MODE_OFF.equals(parameters.getFlashMode())) { turnOn(parameters); } else if (Parameters.FLASH_MODE_TORCH.equals(parameters.getFlashMode())) { turnOff(parameters); } } private void turnOn(Parameters parameters) { parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); camera.setParameters(parameters); turnOnOff.setText("关闭闪光灯"); } private void turnOff(Parameters parameters) { parameters.setFlashMode(Parameters.FLASH_MODE_OFF); camera.setParameters(parameters); // camera.release(); // camera = null; turnOnOff.setText("开启闪光灯"); }
如此,开启闪光灯的操作是成功了,不过关闭闪光灯的操作还是有问题……
我们需要修改surfaceDestroyed()方法:
public void surfaceDestroyed(SurfaceHolder holder) { hasSurface = false; CameraManager.get().stopPreview(); }
如此,在二维码扫描Activity中添加开启/关闭闪光灯操作就完成了
该方法在eoe上已经与作者给出详细介绍了
http://www.eoeandroid.com/thread-235785-1-1.html
相关文章推荐
- 【Android 学习】之二维码扫描开发(闪光灯功能)
- Android平台二维码之生成,扫描 & 识别
- Android 二维码框4个角&上下滚动条&闪光灯
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
- Android 实现闪光灯开关和在之前扫描二维码包中使用方法
- swift 扫描二维码/条形码,开启闪光灯,识别相册二维码
- 给zxing扫描二维码添加闪光灯功能
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- [置顶] android开发之集成zxing,二维码,以及扫描二维码的功能实现。带源代码下载
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- Android开发之Zbar实现二维码扫描功能
- 一起学android之如何以最简单方式开启闪光灯(35)
- android 数行代码集成二维码扫描识别功能
- 扫描二维码自动识别手机系统(Android/IOS)跳转不同页面
- android 二维码 helloworld (二维码的生成与扫描)
- android 二维码的扫描与生成
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(现在正做个扫描App、收藏)
- [Unity+Android]横版扫描二维码 推荐