1. 程式人生 > >二維碼快速掃碼優化方案介紹(一)--怎麽在光線不足時,手機自動進行補光。

二維碼快速掃碼優化方案介紹(一)--怎麽在光線不足時,手機自動進行補光。

ram 平時 implement chang fill change rri ren text

二維碼掃碼已經是一個很通用的技術了,也有很多的開源項目可以實現,比如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;
}
完成上面的優化後,那麽我們掃碼就有了進一步的體驗優化了,可以根據光線的強弱來決定是否需要在掃碼時,進行補光。


二維碼快速掃碼優化方案介紹(一)--怎麽在光線不足時,手機自動進行補光。