Android 禁止屏幕休眠和锁屏的方法

Introduction

常常我们开 发程序的时候我们不需要系统唤醒系统锁屏功能,比如我们在做xxxNowTV或XXX播放器这样的程序,用户有时候在看电视或视频的时候不希望系统的锁屏 功能启动,既不想锁频,然而系统却在我们看电视或者视频的时候出来个锁屏的界面进行锁频拉,我们还要想继续看的话还要去解锁,这样好麻烦,不是我们想要 的,那我们该怎么做呢,其实很简单,我这里只讲其中的两种

一 :我们只要在程序中用代码实现。代码如下:

[java] view plaincopy

  1. //方法一
  2. getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.main);
  3. //方法二
  4. @Override
  5. protected void onResume() {
  6. super.onResume();
  7. pManager = ((PowerManager) getSystemService(POWER_SERVICE));
  8. mWakeLock = pManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
  9. | PowerManager.ON_AFTER_RELEASE, TAG);
  10. mWakeLock.acquire();
  11. }
  12. @Override
  13. protected void onPause() {
  14. super.onPause();
  15. if(null != mWakeLock){
  16. mWakeLock.release();
  17. }
  18. }
  19. //方法三
  20. public void unLock(){
  21. mContentResolver = getContentResolver();
  22. //不建议使用
  23. //setLockPatternEnabled(android.provider.Settings.System.LOCK_PATTERN_ENABLED,false);
  24. //推荐使用
  25. setLockPatternEnabled(android.provider.Settings.Secure.LOCK_PATTERN_ENABLED,false);
  26. }
  27. private void setLockPatternEnabled(String systemSettingKey, boolean enabled) {
  28. //不建议使用
  29. //android.provider.Settings.System.putInt(mContentResolver,systemSettingKey, enabled ? 1 : 0);
  30. //推荐使用
  31. android.provider.Settings.Secure.putInt(mContentResolver, systemSettingKey,enabled ? 1 : 0);
  32. }
  33. //但注意要加权限AndroidManifest.xml文件中加入
  34. //<uses-permission android:name="android.permission.WRITE_SETTINGS" />
  35. //还要特别注意的是要加入 android:sharedUserId="android.uid.system",但有一个问题,
  36. //如果加入了sharedUserId后就不能使用eclipse编译了,一定要手动通过 mm -B进行编译,然后把apk install到模拟器或设备中

二:禁用系统的锁频功能,这方法不建议使用,只有在设当的环境下适当使用既可,我们只要知道这样我们也可以达到这样的功能实现就OK。

我们知道Android系统的锁屏时间存放在Setting数据库中,字段为Settings.System.SCREEN_OFF_TIMEOUT。我们可以查看SettingsProvider源码,查看如下文件的源码如下:

~/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

查看loadSystemSettings()函数的代码如下

[java] view plaincopy

  1. private void loadSystemSettings(SQLiteDatabase db) {
  2. SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
  3. + " VALUES(?,?);");
  4. Resources r = mContext.getResources();
  5. loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
  6. R.bool.def_dim_screen);
  7. loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,
  8. "1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);
  9. loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
  10. R.integer.def_screen_off_timeout);
  11. // Set default cdma emergency tone
  12. loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);
  13. // Set default cdma call auto retry
  14. loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);
  15. // Set default cdma DTMF type
  16. loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
  17. // Set default hearing aid
  18. loadSetting(stmt, Settings.System.HEARING_AID, 0);
  19. // Set default tty mode
  20. loadSetting(stmt, Settings.System.TTY_MODE, 0);
  21. loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,
  22. R.bool.def_airplane_mode_on);
  23. loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,
  24. R.string.def_airplane_mode_radios);
  25. loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,
  26. R.string.airplane_mode_toggleable_radios);
  27. loadBooleanSetting(stmt, Settings.System.AUTO_TIME,
  28. R.bool.def_auto_time); // Sync time to NITZ
  29. loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
  30. R.integer.def_screen_brightness);
  31. loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
  32. R.bool.def_screen_brightness_automatic_mode);
  33. loadDefaultAnimationSettings(stmt);
  34. loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
  35. R.bool.def_accelerometer_rotation);
  36. loadDefaultHapticSettings(stmt);
  37. stmt.close();
  38. }

我们通过查看源码便知道, Settings.System.SCREEN_OFF_TIMEOUT没有初始化的话(系统首次启动,这个字段肯定是没 有初始化的),系统将会利用资源中的R.integer.def_screen_off_timeout来初始化。我们为了让系统永不锁屏,只需要把资源 R.integer.def_screen_off_timeout设为-1即可。查看文件在这里:

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

可以找到R.integer.def_screen_off_timeout的定义

[xhtml] view plaincopy

  1. <integer name="def_screen_off_timeout">60000</integer>

发现默认值为60000ms,也就是60s。我们只需要把这个参数改为-1。然后重新编译SettingsProvider模块,就OK了。

但有时候也会有这样的情况发生,用户进入系统后,修改锁屏时间,为了这样的情况发生我们得在Setting模块中删除对锁屏时间的设置。这样Android设备就不锁屏了。

我们这里还要处理一种情况,就是让系统一启动我们就禁用锁屏的功能,很简单,我们只要把系统锁 屏 功能的的初始默认开关给改以下就可以了,如下找到这个类:

frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java

该文件中有一个变量定义如下:

[java] view plaincopy

  1. /**
  2. * External apps (like the phone app) can tell us to disable the keygaurd.
  3. */
  4. private boolean mExternallyEnabled = true
mExternallyEnabled是用来管理是否开启屏幕锁的关键。默认值是打开屏锁,根据注释可以知道他是希望应用程序来修改这个

值,我们可以把这个值改成false就可以了。
有时候我们不想修改这个初始值,那我们看看这个类有没有提供相应的方法来供外部修改这个值的,不出我们所料,看下面这段代码就是的了:

[java] view plaincopy

  1. /**
  2. * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide
  3. * a way for external stuff to override normal keyguard behavior.  For instance
  4. * the phone app disables the keyguard when it receives incoming calls.
  5. */
  6. public void setKeyguardEnabled(boolean enabled) {
  7. synchronized (this) {
  8. if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")");
  9. mExternallyEnabled = enabled;
  10. if (!enabled && mShowing) {
  11. if (mExitSecureCallback != null) {
  12. if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring");
  13. // we‘re in the process of handling a request to verify the user
  14. // can get past the keyguard. ignore extraneous requests to disable / reenable
  15. return;
  16. }
  17. // hiding keyguard that is showing, remember to reshow later
  18. if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, "
  19. + "disabling status bar expansion");
  20. mNeedToReshowWhenReenabled = true;
  21. hideLocked();
  22. } else if (enabled && mNeedToReshowWhenReenabled) {
  23. ...
  24. ...
  25. }
  26. }
时间: 2024-10-14 04:50:36

Android 禁止屏幕休眠和锁屏的方法的相关文章

CentOS取消屏幕保护自动锁屏功能(图形界面)

CentOS取消屏幕保护自动锁屏功能 1. 问题:默认启动屏幕保护 问题描述: CentOS系统在用户闲置一段时间(默认为5分钟)后,会启动屏幕保护程序(默认的屏保为黑屏),并要求重新输入密码才能回到原来桌面. 2. 解决方法:重新设置屏幕保护 2.1 打开Screensaver Preferences界面 2.2 取消屏幕保护的锁定功能 原文地址:http://blog.51cto.com/10085711/2068301

Android 4.4 不休眠+不锁屏+默认中文+去除导航栏

1.不休眠 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 里面60000改成-1,就是不进入休眠. 这个文件还保存其他默认设置,如: "def_location_providers_allowed" translatable="true">gps "def_location_providers_allowed_network" translatable=&

Android判断屏幕锁屏的方法总结

转载请注明:http://blog.csdn.net/heroxuetao/article/details/24639203 由于做一个项目,需要判断屏幕是否锁屏,发现网上方法很多,但是比较杂,现在进行总结一下: 总共有两类方法: 一.代码直接判定 二.接收广播 现在先说第一类方法(代码直接判定): 1.通过PowerManager的isScreenOn方法,代码如下: PowerManager pm = (PowerManager) context.getSystemService(Conte

[android] 手机卫士设备管理权限锁屏

设备管理员 Device Admin 获取DevicePolicyManager对象,通过getSystemService(DEVICE_POLICY_MANAGER),设备策略管理器 调用DevicePolicyManager对象的lockNow()方法,锁定,此时会报 安全异常 新建一个类MyAdmin继承系统的DeviceAdminReceiver,这个是广播接收者 清单文件进行注册 添加<receiver>节点,设置名称 设置权限 android:permission=”android

Android开机自动启动app 不锁屏

主要参考:http://life173.blog.51cto.com/2035365/543916/ 实现功能,开机后自动启动FirstActivity,并且不用解锁. 贴出源码: 主要是在配置文件中配置:   <receiver android:enabled="true" android:name=".BootUpReceiver"             android:permission="android.permission.RECEIV

Android Activity组件正常以及锁屏状态下的启动流程

前言: Activity是android的四大组件之一,它主要负责管理android应用程序的用户界面. 本文主要从framework的角度去分析activity的启动过程.activity的启动过程根据不同的情况会有一些差别,比如锁屏与非锁屏状态下的区别,activity依附的应用程序进程不存在与已经存在的区别等. 目录: 一.KK4.4从Launcher启动Activity的流程 二.应用内启动子Activity的流程 三.锁屏状态下Activity启动的流程 文章中含有大量的时序图,请直接

Android 禁止屏幕旋转

打开工程中的 AndroidManifest.xml 文件,在 <activity> </activity> 中,添加一条属性信息: android:screenOrientation="portrait" (强制竖屏) android:screenOrientation="landscape" (强制横屏)

Android保持屏幕常亮的三种方法

好长时间没写Blog了,最近又要实现类似功能,每次都百度去找不是很方便,还是在自己的blog上记录一笔吧! 方法共有三种: 1.申请亮屏锁 pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); //得到电源管理器对象 wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.FULL_WAKE_LOCK, "TEST");

Android获取屏幕分辨率官方推荐的新方法

<pre name="code" class="java"> WindowManager wm = this.getWindowManager(); Point screenAttribute = new Point(); wm.getDefaultDisplay().getSize(screenAttribute); Toast.makeText(this, "Screen Width:" + screenAttribute.x +