二维码扫码已经是一个很通用的技术了,也有很多的开源项目可以实现,比如Zxing项目。https://github.com/zxing
这里重点不是介绍Zxing中是怎么样来实现二维码扫码的,而是来介绍一下,微信上的快速扫码技术是如何来做到优化体验的。
要实现在光线不足时,手机自动进行补光,其实很简单,每个人都知道,手机上有很多的传感器,其中有一个很重要的传感器就是光线传感器。
这个大家平时在拍照的时候,都用到过。那么如何能把这个应用到二维码的扫码体验上来呢。
我们可以利用手机的光线传感器进行外部光线感应,到光线很暗时,那么就可以自动进行补光了。这里我们以安卓手机为例,进行说明
在安卓手机中,我们定义一个Button和一个TextView,TextView用来显示从光线传感器中接收到的光线强度指数。Button按钮用于当光线较弱时,自动出来这个Button按钮,可以点击打开手机的闪光灯。当光线较强时,自动隐藏该Button按钮。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
.......
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="补光"
android:id="@+id/flashLightButton"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ligthSensorView"
android:layout_below="@+id/flashLightButton"
android:layout_centerHorizontal="true"
android:layout_marginTop="92dp" />
</RelativeLayout>
</FrameLayout>
在Activity中,我们定义一下上面的Button和TextView
//补光Button
private Button flashLightButton;
//显示出当前的光线强度
private TextView ligthSensorView;
//光线传感器相关
private SensorManager sm;
private Sensor ligthSensor;
flashLightButton = (Button) findViewById(R.id.flashLightButton);
ligthSensorView = (TextView) findViewById(R.id.ligthSensorView);
//光线传感器使用注册
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
ligthSensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT);
sm.registerListener(new MySensorListener(), ligthSensor, SensorManager.SENSOR_DELAY_NORMAL);
//设置Button监听
flashLightButton.setOnClickListener(new flashLightListener());
//flashLightButton的监听实现
class flashLightListener implements View.OnClickListener{
Boolean isopen = false;
@Override
public void onClick(View view) {
if(isopen){
//关灯
CameraManager.get().closeFlashlight();
isopen = false;
}
else{
//开灯
CameraManager.get().openFlashlight();
isopen = true;
}
}
}
//传感器监听
public class MySensorListener implements SensorEventListener {
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
//获取光线的强度
public void onSensorChanged(SensorEvent event) {
//获取精度
float acc = event.accuracy;
//获取光线强度
float lux = event.values[0];
sb = "精度:"+acc+",光线强度:"+lux+"摄像头模式:";
//光线强度展示在ligthSensorView上
ligthSensorView.setText(sb);
int retval = Float.compare(lux, (float) 10.0);
if(retval>0){
//光线强度>10.0隐藏Button
flashLightButton.setVisibility(View.INVISIBLE);
}
else {
//显示Button
flashLightButton.setVisibility(View.VISIBLE);
}
}
}
//通过camera的方式开启闪光灯
public static void turnLightOnCamera(Camera mCamera) {
mCamera.startPreview();
Camera.Parameters parameters = mCamera.getParameters();
List<String> flashModes = parameters.getSupportedFlashModes();
String flashMode = parameters.getFlashMode();
if (!Camera.Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
// 开启闪光灯
if (flashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
mCamera.startPreview();
isOpenFlash = true;
}
}
}
//通过camera的方式关闭闪光灯
public static void turnLightOffCamera(Camera mCamera) {
mCamera.stopPreview();
Camera.Parameters parameters = mCamera.getParameters();
List<String> flashModes = parameters.getSupportedFlashModes();
String flashMode = parameters.getFlashMode();
if (!Camera.Parameters.FLASH_MODE_OFF.equals(flashMode)) {
// 关闭闪光灯
if (flashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
}
}
isOpenFlash = false;
}
完成上面的优化后,那么我们扫码就有了进一步的体验优化了,可以根据光线的强弱来决定是否需要在扫码时,进行补光。
【原文归作者所有,欢迎转载,但是保留版权】