RK3399平台Android7.1系统设置增加一个近距离休眠控制开关

       该功能同电话接听时电话贴近耳朵自动灭屏,当物体距离平板小于一定距离(比如20公分),则自动灭屏,对于一些教学用的平板电脑,该功能可以预防学生过近的观看平板内容,可预防近视。

  1. 首先在Settings.java里面添加一些全局属性:

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);
    }
    ……//此处省略好多行
}
}

 

你可能感兴趣的:(Android开发)