寫在前面
一眨眼8月了,今年的目標(biāo)完成多少了?看看銀行存款.......恩,這個(gè)手續(xù)費(fèi)真感人..... 感人完了,繼續(xù)完善Android中的傳感器.

陀螺儀傳感器
官方文檔:https://developer.android.google.cn/reference/android/hardware/Sensor.html#TYPE_GYROSCOPE
陀螺儀這東西本來是直升機(jī)上的,后被用到手機(jī)上,主要用來檢測(cè)手機(jī)旋轉(zhuǎn)時(shí)的轉(zhuǎn)動(dòng)角角度,通常和加速傳感器一起使用(太過高大上,表示我也不知道這東西具體有什么用).
public class GyroscopeUtils{
private final SensorManager mSensorManager;
private Sensor mDefaultSensor;
/**
* 陀螺儀傳感器,超級(jí)敏感,數(shù)值變化快
* @param context
*/
public GyroscopeUtils(Context context){
//SensorManager代表了各類傳感器的集合
mSensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
if (mSensorManager != null) {
//加速傳感器
mDefaultSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
}
}
public void getAngle(SensorEventListener sensorEventListener) {
mSensorManager.registerListener(sensorEventListener, mDefaultSensor, SensorManager.SENSOR_DELAY_UI);
}
/**
* 解除注冊(cè)
* @param sensorEventListener
*/
public void unregister(SensorEventListener sensorEventListener){
mSensorManager.unregisterListener(sensorEventListener);
}
}
需要注意的是,必須使用真機(jī)檢測(cè),使用完畢后需要解除注冊(cè).
case Sensor.TYPE_GYROSCOPE:
//數(shù)值過于靈敏,會(huì)造成屏幕不停刷新,慎點(diǎn)
mTv_angle.setText("x" + sensorEvent.values[0] + " " + "y" + sensorEvent.values[1] + " " + "z" + sensorEvent.values[2]);
break;

距離傳感器
官方文檔:https://developer.android.google.cn/reference/android/hardware/Sensor.html#STRING_TYPE_PROXIMITY
距離傳感器,顧名思義就是用來檢測(cè)距離的,有一個(gè)廣泛的應(yīng)用就是,在我們打電話的時(shí)候,為了避免臉大誤觸屏幕,屏幕會(huì)自動(dòng)黑掉,這就是距離傳感器的作用,那么具體怎么用呢,看代碼:
public class DistanceUtils {
private final SensorManager mSensorManager;
private Sensor mDefaultSensor;
/**
* 距離傳感器,打電話時(shí)自動(dòng)黑屏防誤觸用到的就是這個(gè)
*
* @param context
*/
public DistanceUtils(Context context) {
//SensorManager代表了各類傳感器的集合
mSensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
if (mSensorManager != null) {
//加速傳感器
mDefaultSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
}
public void getDistance(SensorEventListener sensorEventListener) {
mSensorManager.registerListener(sensorEventListener, mDefaultSensor, SensorManager.SENSOR_DELAY_UI);
}
/**
* 解除注冊(cè)
*
* @param sensorEventListener
*/
public void unregister(SensorEventListener sensorEventListener) {
mSensorManager.unregisterListener(sensorEventListener);
}
}
同樣,當(dāng)值變化時(shí)會(huì)在回調(diào)方法onSensorChanged中顯示出數(shù)值,此處就省略了,我們來看怎么讓手機(jī)實(shí)現(xiàn)鎖屏.
鎖屏
官方文檔;https://developer.android.google.cn/reference/android/os/PowerManager.html
我們會(huì)用距離傳感器了,那我們就用他來做點(diǎn)什么.
mLocalPowerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
----------------------------------------------------
public void lockScreen(float value) {
//此處為電源鎖級(jí)別,不同級(jí)別對(duì)鍵盤,CPU有不同的影響
mWakeLock = mLocalPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "xxxxxx_yk");
if (value == 0.0) {
// 貼近手機(jī)
if (mWakeLock.isHeld()) {
return;
} else {
// 鎖屏
mWakeLock.acquire();
}
} else {
//遠(yuǎn)離手機(jī)
if (mWakeLock.isHeld()) {
return;
} else {
//計(jì)數(shù)鎖
mWakeLock.setReferenceCounted(false);
mWakeLock.release();
}
}
}
------------------------------------------------------------------------------
case Sensor.TYPE_PROXIMITY:
//值不一定,測(cè)試榮耀8近距離時(shí)返回0,離開返回5,魅族返回1
Log.e("xxxxxx_yk",sensorEvent.values[0] + "");
//模擬打電話時(shí)的鎖屏
mDistanceUtils.lockScreen(sensorEvent.values[0]);
當(dāng)然,鎖屏屬于隱私行為了,需要權(quán)限
<uses-permission android:name="android.permission.WAKE_LOCK"/>
開始運(yùn)行,手指靠近距離傳感器,發(fā)現(xiàn)屏幕立馬變黑了,完美通過,模擬出我們?cè)诖螂娫挄r(shí)候的場(chǎng)景,切記切記,使用完成后解除注冊(cè),不然你會(huì)發(fā)現(xiàn),屏幕一直受影響

//解除注冊(cè)
mWakeLock.release();
到此,Sensor里的傳感器接觸的就差不多了,其他沒有講到的使用方式基本一致,可以自行嘗試,挖掘更多的功能.
結(jié)尾
今天是8.3號(hào),傳說中的男人節(jié),下了班去幫媳婦做苦力,彰顯一下男人氣息,本次推薦的歌,old_boy,祝所有男同胞們節(jié)日快樂,不說了,準(zhǔn)備下班干苦力了.
