zoukankan      html  css  js  c++  java
  • 二维码快速扫码优化方案介绍(一)--怎么在光线不足时,手机自动进行补光。

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

     【原文归作者所有,欢迎转载,但是保留版权】
  • 相关阅读:
    jenkins代理设置
    通过jenkins api 触发远程构建
    python小技巧-统计列表中每个元素的个数
    python列表反转
    python 黑板课爬虫闯关-第三关
    python 黑板课爬虫闯关-第二关
    python 黑板课爬虫闯关-第一关
    python 黑板课爬虫闯关-第五关
    爬虫-识别图形验证码-tesserocr
    python 黑板课爬虫闯关-第四关
  • 原文地址:https://www.cnblogs.com/laoqing/p/7301149.html
Copyright © 2011-2022 走看看