先说以下需求吧:
由于我的应用是唯一的Launcher,也就是开机系统会自动启动的前端界面,那么可以使用DISABLE_KEYGUARD的方式实现开机不出现锁屏界面。但是仅仅是开机不出现锁屏界面是不够的,在进入到其他应用的时候,时间一长,还是会锁屏,你可能会说,那我就把所有的应用DISABLE_KEYGUARD。
嗯,听起来可行,不过如果用户按了电源键,那么这种方式还是不够靠谱。
这种方式是开机不出现锁屏,直接进入到指定应用(比如我这里的是替换了系统Launcher的自定义Launcher)。
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休眠时间修改为最大值,最大值就是永不休眠。
2147483647
在修改休眠时间的时候我发现也可以通过配置的方式实现第一种效果,开机不锁屏。
我们来看一下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
true
修改完成之后,记得把文件推过去
Z:\nexus_source\out\target\product\mako\system\priv-app\SettingsProvider>adb pus
h SettingsProvider.apk /system/priv-app/SettingsProvider/SettingsProvider.apk
Z:\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
false
到了这里基本差不多了,但是为了防止用户手动设置休眠时间,我们还可以通过修改源码的方式,让用户的修改失效,这个是从源码里面看到的,当作参考:
/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;//[email protected] 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;
}