Android傳感器開發(fā)(下)

寫在前面

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

image.png

陀螺儀傳感器

官方文檔: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;
image.png

距離傳感器

官方文檔: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),屏幕一直受影響

image.png
//解除注冊(cè)
  mWakeLock.release();

到此,Sensor里的傳感器接觸的就差不多了,其他沒有講到的使用方式基本一致,可以自行嘗試,挖掘更多的功能.

結(jié)尾

今天是8.3號(hào),傳說中的男人節(jié),下了班去幫媳婦做苦力,彰顯一下男人氣息,本次推薦的歌,old_boy,祝所有男同胞們節(jié)日快樂,不說了,準(zhǔn)備下班干苦力了.

old_boy.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容