Android5.0去掉开机锁屏和休眠

来源:互联网 发布:手机淘宝返利网怎么用 编辑:程序博客网 时间:2024/06/16 09:33

先说以下需求吧:
1. 开机不锁屏
2. 开机后不锁屏
3. 开机后按了电源键只熄屏不锁屏
4. 以上功能的修改不影响设置熄屏时间

需求分析

由于我的应用是唯一的Launcher,也就是开机系统会自动启动的前端界面,那么可以使用DISABLE_KEYGUARD的方式实现开机不出现锁屏界面。但是仅仅是开机不出现锁屏界面是不够的,在进入到其他应用的时候,时间一长,还是会锁屏,你可能会说,那我就把所有的应用DISABLE_KEYGUARD。

嗯,听起来可行,不过如果用户按了电源键,那么这种方式还是不够靠谱。

应用程序开机不锁屏

这种方式是开机不出现锁屏,直接进入到指定应用(比如我这里的是替换了系统Launcher的自定义Launcher)。

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

onCreate中加入,最好在setContentView(R.layout.main)之前

getWindow().setFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,         WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,         WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

应用程序全屏显示
在配置文件的《application》中加入

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

不休眠实现

不休眠可以修改系统源码,去掉休眠功能,但是这种代价太大,我们不知道改了之后会不会引起其他问题。因此从侧面入手,我发现可以修改休眠时间的方式达到效果。
主要在/frameworks/base/packages/SettingsProvider/res/values/defaults.xml中修改 ,
将def_screen_off_timeout休眠时间修改为最大值,最大值就是永不休眠。

<integer name="def_screen_off_timeout">2147483647</integer>

在修改休眠时间的时候我发现也可以通过配置的方式实现第一种效果,开机不锁屏。

我们来看一下SettingProvider中的源码:
vim frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

 if (SystemProperties.getBoolean("ro.lockscreen.disable.default", false) == true) {                loadSetting(stmt, Settings.System.LOCKSCREEN_DISABLED, "1");            } else {                loadBooleanSetting(stmt, Settings.System.LOCKSCREEN_DISABLED,                        R.bool.def_lockscreen_disabled);            }

这里的意思是说,如果从系统属性中读到的禁用锁屏为true则执行禁用锁屏,否则采用def_lockscreen_disabled的配置,而def_lockscreen_disabled在SettingsProvider/res/values/defaults.xml 当中;

我们先来修改SettingsProvider/res/values/defaults.xml 试试
vim frameworks/base/packages/SettingsProvider/res/values/defaults.xml
修改def_lockscreen_disabled为true

<bool name="def_lockscreen_disabled">true</bool>

修改完成之后,记得把文件推过去

Z:\nexus_source\out\target\product\mako\system\priv-app\SettingsProvider>adb push SettingsProvider.apk /system/priv-app/SettingsProvider/SettingsProvider.apkZ:\nexus_source\out\target\product\mako\system\priv-app\SettingsProvider>adb reboot

嗯,我的设备不行,毛线效果都没有,因此,修改第一句:
修改源代码:
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

if (SystemProperties.getBoolean("ro.lockscreen.disable.default", false) == true) 改为if (SystemProperties.getBoolean("ro.lockscreen.disable.default", true) == true) 

这里要注意,如果ro.lockscreen.disable.default默认是false的,我们可以先改成默认true,如果默认的配置配置的也是false,那么我们进入到配置文件里面改成true;
ss

电源键不锁屏

如何实现按下电源键不休眠呢?想不到这个也能配置,修改def_screenshot_button_show为false可以屏蔽电源键锁屏功能,若是没有这个参数可以手动添加
位于:
frameworks/base/packages/SettingsProvider/res/values/default.xml

<bool name="def_screenshot_button_show">false</bool>

锁定休眠时间

到了这里基本差不多了,但是为了防止用户手动设置休眠时间,我们还可以通过修改源码的方式,让用户的修改失效,这个是从源码里面看到的,当作参考:
/packages/apps/Settings/src/com/android/settings/DisplaySettings.java

@Override    public boolean onPreferenceChange(Preference preference, Object objValue) {        final String key = preference.getKey();        if (KEY_SCREEN_TIMEOUT.equals(key)) {            try {                int value = Integer.parseInt((String) objValue);                value = Integer.MAX_VALUE;//larsonzhong@163.com added                Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, value);                updateTimeoutPreferenceDescription(value);            } catch (NumberFormatException e) {                Log.e(TAG, "could not persist screen timeout setting", e);            }        }        if (KEY_FONT_SIZE.equals(key)) {            writeFontSizePreference(objValue);        }        if (preference == mAutoBrightnessPreference) {            boolean auto = (Boolean) objValue;            Settings.System.putInt(getContentResolver(), SCREEN_BRIGHTNESS_MODE,                    auto ? SCREEN_BRIGHTNESS_MODE_AUTOMATIC : SCREEN_BRIGHTNESS_MODE_MANUAL);        }        if (preference == mLiftToWakePreference) {            boolean value = (Boolean) objValue;            Settings.Secure.putInt(getContentResolver(), WAKE_GESTURE_ENABLED, value ? 1 : 0);        }        if (preference == mDozePreference) {            boolean value = (Boolean) objValue;            Settings.Secure.putInt(getContentResolver(), DOZE_ENABLED, value ? 1 : 0);        }        return true;    }