该功能同电话接听时电话贴近耳朵自动灭屏,当物体距离平板小于一定距离(比如20公分),则自动灭屏,对于一些教学用的平板电脑,该功能可以预防学生过近的观看平板内容,可预防近视。
frameworks/base/core/java/android/provider/Settings.java
/**
* Control whether to enable automatic screenoff mode.
*/
public static final String SCREEN_OFF_MODE = "auto_screenoff_mode";
private static final Validator SCREEN_OFF_MODE_VALIDATOR = sBooleanValidator;
……//此处省略好多行
/**
* SCREEN_BRIGHTNESS_MODE value for manual mode.
*/
public static final int SCREEN_BRIGHTNESS_MODE_MANUAL = 0;
/**
* SCREEN_BRIGHTNESS_MODE value for automatic mode.
*/
public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1;
……//此处省略好多行
public static final String[] SETTINGS_TO_BACKUP = {
……//此处省略好多行
SCREEN_OFF_MODE
}
public static final Set PUBLIC_SETTINGS = new ArraySet<>();
static {
……//此处省略好多行
PUBLIC_SETTINGS.add(SCREEN_OFF_MODE);
}
public static final Map VALIDATORS = new ArrayMap<>();
static {
……//此处省略好多行
VALIDATORS.put(SCREEN_OFF_MODE, SCREEN_OFF_MODE_VALIDATOR);
}
2.在sensor监听器里面处理:
frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java
import android.provider.Settings;
import static android.provider.Settings.System.SCREEN_OFF_MODE;
import static android.provider.Settings.System.SCREEN_OFF_MODE_MANUAL;
import static android.provider.Settings.System.SCREEN_OFF_MODE_AUTOMATIC;
public class SystemUIService extends Service implements SensorEventListener{
……//此处省略好多行
@Override
public void onSensorChanged(SensorEvent event) {
int screenoffMode = Settings.System.getInt(getContentResolver(),
SCREEN_OFF_MODE, SCREEN_OFF_MODE_MANUAL);//在这里获取灭屏模式
Log.d("haming==>", "screenoffMode = " + screenoffMode);
float[] its = event.values;
if(its!=null && event.sensor.getType() == Sensor.TYPE_PROXIMITY){
if(its[0] == 0.0 && screenoffMode == SCREEN_OFF_MODE_AUTOMATIC){
mHandler = new Handler();
mRunnable = new Runnable() {
@Override
public void run() {
Log.d("haming==>", "-----sleep sleep sleep!-------");
localWakeLock.acquire();
resetHandle();
}
};
mHandler.postDelayed(mRunnable,3000);
}else{
resetHandle();
localWakeLock.setReferenceCounted(false);
localWakeLock.release();
}
}
}
}
3.在设置布局文件中添加开关:
packages/apps/Settings/res/xml/display_settings.xml
4.在设置显示类文件中增加开关监听:
packages/apps/Settings/src/com/android/settings/DisplaySettings.java
import static android.provider.Settings.System.SCREEN_OFF_MODE;
import static android.provider.Settings.System.SCREEN_OFF_MODE_MANUAL;
import static android.provider.Settings.System.SCREEN_OFF_MODE_AUTOMATIC;
public class DisplaySettings extends SettingsPreferenceFragment implements
Preference.OnPreferenceChangeListener, Indexable {
……//此处省略好多行
private static final String KEY_AUTO_SCREENOFF = "auto_screenoff";
……//此处省略好多行
private SwitchPreference mAutoScreenoffPreference;
……//此处省略好多行
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
……//此处省略好多行
mAutoScreenoffPreference = (SwitchPreference) findPreference(KEY_AUTO_SCREENOFF);
mAutoScreenoffPreference.setOnPreferenceChangeListener(this);
}
private void updateState() {
updateFontSizeSummary();
updateScreenSaverSummary();
// Update auto brightness if it is available.
if (mAutoBrightnessPreference != null) {
int brightnessMode = Settings.System.getInt(getContentResolver(),
SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL);
mAutoBrightnessPreference.setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL);
}
……//此处省略好多行
}
@Override
public boolean onPreferenceChange(Preference preference, Object objValue) {
……//此处省略好多行
if (preference == mAutoScreenoffPreference) {
boolean auto = (Boolean) objValue;
Settings.System.putInt(getContentResolver(), SCREEN_OFF_MODE, auto ? SCREEN_OFF_MODE_AUTOMATIC : SCREEN_OFF_MODE_MANUAL);
}
……//此处省略好多行
}
}