2023年3月9日发(作者:儿童小游戏大全)Android的屏幕禁止休眠和锁屏的方法
Android的屏幕禁止休眠的方法
。实现这一功能的方法有两种,一种是在的文件里面声明,一种是在代码里面修改的LayoutParams的标志位具体如下:
1,在文件里面用的用户权限声明代码如下。:
用途,许可>这种方法,在安装apk文件时,系统会提示安装人是否允许使用禁止休眠功能。
2,在程序中用代码实现代码如下。:
。getWindow()tFlags(_KEEP_SCREEN_ON,_KEEP_SCREEN_ON);把这段代码加在tContentView()之前即可。
---------------------------------------
锁定屏幕对于移动终端来说是非常有必要的,但是对于机顶盒产品就没有这个必要了。所以本文介绍一下怎样让Android的设备永不锁屏。
机器人系统的锁屏时间存放在设置数据库中,字段为_OFF_TIMEOUT查看SettingsProvider源码,查看如下文件的源码。:
/基/包/ SettingsProvider /型钢/的COM /机器人/供应商/设置/ 框架
查看loadSystemSettings()函数的代码如下:
私人无效loadSystemSettings(SQLiteDataba分贝){
SQLiteStatement到stmt = eStatement(“INSERT或忽略到系统(名称,值)”
+“值(?,?);");
资源研究= ources();
loadBooleanSetting(stmt中,_SCREEN,
_dim_screen);
loadSetting(stmt中,_ON_WHILE_PLUGGED_IN,
“1”。等于((“”))? 1:0);
loadIntegerSetting(stmt中,_OFF_TIMEOUT,
_screen_off_timeout);
/ /设置默认的CDMA紧急调
loadSetting(stmt中,NCY_TONE,0);
/ /设置默认CDMA呼叫自动重试
loadSetting(stmt中,_AUTO_RETRY,0);
/ /设置默认的CDMA双音多频式
loadSetting(stmt中,_TONE_TYPE_WHEN_DIALING,0);
/ /设置默认助听器
loadSetting(stmt中,G_AID,0);
/ /设置默认tty模式
loadSetting(stmt中,_MODE,0);
loadBooleanSetting(stmt中,NE_MODE_ON,
_airplane_mode_on);
loadStringSetting(stmt中,NE_MODE_RADIOS,
_airplane_mode_radios);
loadStringSetting(stmt中,NE_MODE_TOGGLEABLE_RADIOS,
ne_mode_toggleable_radios);
loadBooleanSetting(stmt中,_TIME,
_auto_time); / /同步时间尼茨
loadIntegerSetting(stmt中,_BRIGHTNESS,
_screen_brightness);
loadBooleanSetting(stmt中,
_BRIGHTNESS_MODE,
_screen_brightness_automatic_mode);
loadDefaultAnimationSettings(stmt中);
loadBooleanSetting(stmt中,ROMETER_ROTATION,
_accelerometer_rotation);
loadDefaultHapticSettings(stmt中);
();
}
从代码中我们可以看出,假如_OFF_TIMEOUT没有初始化的话(系统首次启动,这个字段肯定是没有初始化的),将会利用资源中的_screen_off_timeout来初始化。我们为了让系统永不锁屏,只需要把资源_screen_off_timeout设为-1即可。查看文件
框架/基/包/ SettingsProvider /水库/价值/
可以找到_screen_off_timeout的定义。
60000 整数>
发现默认值为60000ms,也就是60秒。我们只需要把这个参数改为-1。然后重新编译SettingsProvider模块,就行了。
另外为了防止用户进入系统后,修改锁屏时间,在设置模块中删除对锁屏时间的设置。这样的Andr??oid设备就永不锁屏了。
后来发现我的机器人设备烧录好之后第一次启动永远不会锁屏,但是设备重启之后开机就进入锁屏状态,解锁之后就再也不会锁屏了(因为永远不超时)。看来“革命尚未成功,仍需努力”啊。
那么为什么启动之后没有进入锁屏状态呢?是不会系统有把超时锁屏的值给修改了呢?我通过sqlite3的去查看的内容,发现超时锁屏的值仍然是-1 。说明启动之后,系统并没有去数据库中查看屏幕超时锁屏的值,就直接锁屏了。
但是怎样才能开机之后不进入锁屏状态呢?这个是个非常费思量的问题。经过去,我知道锁屏的代码在中,然后顺藤摸瓜,终于找到了可以设置锁屏功能开关的位置。代码位于:
框架/政策/基/电话/的COM /机器人/内部/政策/ impl /
该文件中有一个变量定义如下:
/ **
*外部应用程序(如手机应用程序)可以告诉我们,以禁用keygaurd。
* /
私人布尔mExternallyEnabled =真;
mExternallyEnabled是用来管理是否开启屏幕锁的关键。默认值是打开屏锁,根据注释可以知道他是希望应用程序来修改这个值。但是经过加打印信息发现开机的时候没有任何应用程序会修改它。修改这个值调用如下函数:
/ **
*相同的语义链接WindowManagerPolicy {@#enableKeyguard};提供
*一个外部的东西的方式来覆盖正常的键盘保护的行为。 例如
*在手机应用程序禁用键盘锁时,它接收来电。
* /
公共无效tKeyguardEnabled(布尔启用){
同步(这个){
如果(调试)Log.d(没错,“tKeyguardEnabled(”+功能+ ")");
mExternallyEnabled =启用;
如果(!启用&mShowing){
如果(mExitSecureCallba
ck!=空){
如果(调试)Log.d(没错,“在verifyUnlock请求的过程中,无视”);
/ /我们在处理一个请求,以验证用户进程
/ /可以得到过去的键盘锁。 忽略多余的要求禁用/重新启用
返回;
}
/ /隐藏键盘锁即显示,记得要重新出现后
如果(调试)Log.d(没错,“记住要重新出现,隐藏键盘锁,”
+“禁用状态栏扩张”);
mNeedToReshowWhenReenabled =真;
hideLocked();
}否则如果(启用&&mNeedToReshowWhenReenabled){
/ /重新启用后,以前隐藏的,重新出现
如果(调试)Log.d(没错,“以前隐藏的,reshowing,重新启用”
+“状态栏扩张”);
mNeedToReshowWhenReenabled = 0;
如果(mExitSecureCallback!=空){
如果(调试)Log.d(没错,“onKeyguardExitResult(假),重置”);
uardExitResult(假);
mExitSecureCallback = 0;
retStateLocked();
还有{}
showLocked();
/ /阻塞,直到我们知道keygaurd完成图纸(和后一个信息
/ /超时后解除封锁我们,让我们不要冒险封锁太久
/ /并导致国家情报局)。
mWaitingUntilKeyguardVisible =真;
ptyMessageDelayed(KEYGUARD_DONE_DRAWING,KEYGUARD_DONE_DRAWING_TIMEOUT_MS);
如果(调试)Log.d(没错,“等到mWaitingUntilKeyguardVisible是假的”);
而(mWaitingUntilKeyguardVisible){
尝试{
等待();
}捕捉(InterruptedException的é){
tThread()中断()。
}
}
如果(调试)Log.d(没错,“做mWaitingUntilKeyguardVisible等待”);
}
}
}
}
经过上面的讨论我们可以发现我们有两个解决方法:
1,定义变量的时候,给其初始化为假。
2,在发射模块启动的时候,调用tKeyguardEnabled方法,关闭锁屏功能。
我懒得修改Laucher模块,我的解决方法就是在定义mExternallyEnabled时修改其初始值为假各位朋友可以根据自己的实际情况选择解决方案我的代码如下。。:
/ **
*外部应用程序(如手机应用程序)可以告诉我们,以禁用keygaurd。
* /
私人布尔mExternallyEnabled = 0;
这样修改之后,机器人设备开机之后,默认不会进入锁屏状态,除非你在应用程序中调用tKeyguardEnabled方法显示打开这个功能。因为设置的超时时间为-1,则永远也不会进入锁屏界面。完全满足了我的需求,终于大功告成了。开心啊?!