一、问题
有客户的需求,项目的开发才不会循规蹈矩,才会遇到各种各样的问题。不过今天遇到的问题,确实让人摸不到头脑。
项目需要扫描条码,于是使用了
条码扫描二维码扫描——ZXing android 源码简化中所使用的ZXing,项目进行的很顺利,能够正常的扫描条码,同时能够获得条码相应的信息。由于项目使用环境的原因,客户提出要求要在打开摄像头进行条码扫描的时候同时打开闪光灯,同时要将闪光灯保持常亮状态,而不是在对焦的时候闪烁。这个问题也好解决,编写好代码之后在
联想乐Pad K1 WLAN 16GB能够正常运行,打开摄像头之后能够保持闪光灯的常亮。但是,问题出现了,这段代码在运行到
三星GALAXY Tab P7510的时候闪光灯硬是没有反应,同样的代码,出现这样的问题,是在是让人费解。
在stackoverflow上看到了很多人都遇到了这样的问题,比较典型的是
How to use camera flash/led as torch on a Samsung Galaxy Tab?得知这是设备的差异性问题造成的。但是出现这样的问题,我们也不能告诉客户,因为设备差异性原因我们的代码无法在指定的
三星GALAXY Tab P7510运行。于是找答案。
二、解决方案
我们安装了
我查查这个比较流行的条码扫面软件,发现它可以在打开摄像头时同时保持闪光灯的常量,但是其不是一打开摄像头就让闪光灯亮的,是让用户选择是否打开闪关灯,于是乎答案出来了。我们采用同样的解决方案,在打开摄像头之后,让用户选中是否打开闪光灯,这样就可以设置闪光灯的状态,同时可以让其在
三星GALAXY Tab P7510上正常运行。
三、代码
在
条码扫描二维码扫描——ZXing android 源码简化的基础之上改造,main.xml文件如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SurfaceView
android:id="@+id/preview_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:layout_gravity="center" />
<com.zijunlin.Zxing.Demo.view.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/transparent" />
<TextView
android:id="@+id/txtResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp" />
<Button
android:id="@+id/magic"
android:layout_gravity="right|center_vertical"
android:background="@drawable/ic_flash_off"
android:layout_width="55dp"
android:layout_height="55dp"
android:onClick="click" />
</FrameLayout>
CaptureActivity.java添加代码如下:
int i = 0;
/**
* 根据用户的选择,设定闪光灯的状态
* @param v
*/
public void click(View v) {
switch (i % 3) {
case 0:
CameraManager.get().setFlashOn("torch");
magic.setBackgroundResource(R.drawable.ic_flash_troch);
break;
case 1:
CameraManager.get().setFlashOn("on");
magic.setBackgroundResource(R.drawable.ic_flash_on);
break;
case 2:
CameraManager.get().setFlashOn("off");
magic.setBackgroundResource(R.drawable.ic_flash_off);
break;
}
i++;
}
CameraManager添加代码如下:
public void setFlashOn(String type){
Camera.Parameters param = camera.getParameters();
param.setFlashMode(type);
camera.setParameters(param);
}
四、效果图
关闭闪光灯状态(默认)
闪光灯常亮状态

闪光灯随对焦闪烁状态
