近期瑞躺,在調(diào)試自己的Android2.3.4系統(tǒng)(三星s5pv210平臺(tái))時(shí)敷搪,發(fā)現(xiàn)自己的light sensor不僅僅是光傳感器,還有靠近/接近傳感器功能(Proximity)幢哨,而自己的平臺(tá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)開關(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類里添加如下內(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)開關(guān)控制界面實(shí)現(xiàn)好了莱没,接下來要實(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;
接下來在public class PhoneWindowManager implements WindowManagerPolicy類中添加如下內(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;
接下來在void observe()函數(shù)中添加如下內(nèi)容:
resolver.registerContentObserver(Settings.System.getUriFor(PROXIMITY_CLOSE),false,this);
接下來在上面的函數(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");
}
}
接下來在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)好了妄壶,接下來要看你的Proximity Sensor發(fā)力了。