二维码扫码已经是一个很通用的技术了,也有很多的开源项目可以实现,比如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;}
完成上面的优化后,那么我们扫码就有了进一步的体验优化了,可以根据光线的强弱来决定是否需要在扫码时,进行补光。
时间: 2024-11-02 21:38:36