您的位置:首页 > 移动开发 > Android开发

Android之扫描二维码&开启闪光灯

2013-08-06 17:50 393 查看
在本人开发的Android项目中先加入了扫描二维码功能(google的zxing)

然后又有需求要在扫描二维码的同时,可以打开闪光灯……

如此一个身心健康的年轻程序员慢慢的走向了死亡…………开个玩笑

上篇文章就是先写了个开启闪光灯的操作

不过当集成到项目中的时候就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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐