距離傳感器自動(dòng)待機(jī)

近期,在調(diào)試自己的Android2.3.4系統(tǒng)(三星s5pv210平臺(tái))時(shí),發(fā)現(xiàn)自己的light sensor不僅僅是光傳感器,還有靠近/接近傳感器功能(Proximity),而自己的平臺(tái)也沒(méi)有通話功能,故將其利用起來(lái),模仿ipad2做個(gè)蓋子關(guān)屏功能,我這邊實(shí)現(xiàn)的是靠近讓系統(tǒng)待機(jī),相當(dāng)于我們平臺(tái)上的短按電源鍵待機(jī)操作。對(duì)于我們的Proximity Sensor,可以獲取到8位精度的值,而我們?cè)贚inux驅(qū)動(dòng)上報(bào)時(shí)只傳兩個(gè)狀態(tài):遠(yuǎn)和近,故在Android HAL上也只傳兩個(gè)狀態(tài):0和100cm,這已足夠我們功能實(shí)現(xiàn)了,下面是功能實(shí)現(xiàn)的兩個(gè)步驟:

1、前臺(tái)開(kāi)關(guān)

在Settings/Display里添加一項(xiàng)Auto-close screen,這里實(shí)現(xiàn)是一個(gè)復(fù)選框,相應(yīng)的操作如下:

1)、修改packages/apps/Settings/res/xml/display_settings.xml文件,添加:

android:key="proximity"

android:title="@string/proximity_title"/>

2)、修改packages/apps/Settings/res/values/strings.xml文件,添加:

Auto-close screen

由于此處是實(shí)驗(yàn)用,故不實(shí)現(xiàn)多國(guó)語(yǔ)言,暫不修改其他values-*目錄下的strings.xml文件。

3)、修改packages/apps/Settings/src/com/android/settings/DisplaySettings.java文件,在public class DisplaySettings extends PreferenceActivity implementsPreference.OnPreferenceChangeListener類(lèi)里添加如下內(nèi)容:

private static final String KEY_PROXIMITY = "proximity";

private static final String PROXIMITY_CLOSE = "proximity_close";

private CheckBoxPreference mProximity;

在protected void onCreate(Bundle savedInstanceState)函數(shù)里添加如下內(nèi)容:

mProximity = (CheckBoxPreference) findPreference(KEY_PROXIMITY);

mProximity.setPersistent(false);

在private void updateState(boolean force)函數(shù)里添加如下內(nèi)容:

mProximity.setChecked(Settings.System.getInt(getContentResolver(),PROXIMITY_

CLOSE,0) != 0);

在public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)函數(shù)里添加如下內(nèi)容:

if (preference == mProximity) {

Settings.System.putInt(getContentResolver(),PROXIMITY_CLOSE,mProximity.isChecked() ? 1 : 0);

}

至此,整個(gè)用戶控制界面實(shí)現(xiàn)好了,即我們的前臺(tái)開(kāi)關(guān)控制界面實(shí)現(xiàn)好了,接下來(lái)要實(shí)現(xiàn)后臺(tái)數(shù)據(jù)控制了。

2、后臺(tái)實(shí)現(xiàn)

后臺(tái)相對(duì)簡(jiǎn)單點(diǎn),因?yàn)椴挥眯薷奶辔募恍栊薷膄rameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java文件即可。

在文件中添加如下包含:

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.hardware.SensorEvent;

import android.hardware.Sensor;

接下來(lái)在public class PhoneWindowManager implements WindowManagerPolicy類(lèi)中添加如下內(nèi)容:

static final int DEFAULT_PROXIMITY_SCREEN_CLOSE = 0;

int mProximityDefault = DEFAULT_PROXIMITY_SCREEN_CLOSE;

private static final String PROXIMITY_CLOSE = "proximity_close";

SensorManager mSensorManager;

Sensor mProximitySensor;

接下來(lái)在void observe()函數(shù)中添加如下內(nèi)容:

resolver.registerContentObserver(Settings.System.getUriFor(PROXIMITY_CLOSE),false,this);

接下來(lái)在上面的函數(shù)后添加如下定義內(nèi)容:

private SensorEventListener proximityListener = new SensorEventListener(){

@Override

public void onSensorChanged(SensorEvent event){

//Log.v(TAG,"onSensorChanged");

switch (event.sensor.getType()){

case Sensor.TYPE_PROXIMITY:

if (event.values[0] == 0){//near

//Log.v(TAG,"near");

PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);

pm.goToSleep(SystemClock.uptimeMillis());

}

else {//far

//Log.v(TAG,"far");

}

break;

}

//Log.v(TAG,"type="+event.sensor.getType());

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

//Log.v(TAG,"onAccuracyChanged");

}

};

void updateScreenCloseListerner() {

if (mProximityDefault == 1)

{//allow proximity sensor to close screen

mSensorManager =(SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);

mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

mSensorManager.registerListener(proximityListener,mProximitySensor,SensorManager.SENSOR_DELAY_FASTEST);

Log.v(TAG,"proximity control screen allowed");

}

else if (mProximityDefault == 0)

{//not allow

mSensorManager.unregisterListener(proximityListener);

Log.v(TAG,"proximity control screen not allowed");

}

}

接下來(lái)在public void updateSettings()函數(shù)中添加如下內(nèi)容:

int proximityDefault = Settings.System.getInt(resolver,PROXIMITY_CLOSE,DEFAULT_PROXIMITY_SCREEN_CLOSE);

if (mProximityDefault != proximityDefault) {

mProximityDefault = proximityDefault;

updateScreenCloseListerner();

}

至此,整個(gè)后臺(tái)的控制也實(shí)現(xiàn)好了,接下來(lái)要看你的Proximity Sensor發(fā)力了。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,937評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,538評(píng)論 19 139
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,857評(píng)論 2 45
  • ?《紅番區(qū)》是嘉禾娛樂(lè)事業(yè)有限公司出品的一部動(dòng)作電影,由成龍、梅艷芳、董驃、葉芳華主演,該片于1994年在香港、加...
    d55a31d8c39e閱讀 2,047評(píng)論 0 1
  • 記憶中你的樣子, 已經(jīng)是碎成渣的可憐兮兮。 曾經(jīng)的過(guò)往, 我們伸手卻早已回不去了。 偶然之間的想你, 只是徘徊于過(guò)...
    阿俊xi閱讀 379評(píng)論 0 1

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