Introduction
常常我們開 發程式的時候我們不需要系統喚醒系統鎖屏功能,比如我們在做xxxNowTV或XXX播放器這樣的程式,使用者有時候在看電視或視頻的時候不希望系統的鎖屏 功能啟動,既不想鎖頻,然而系統卻在我們看電視或者視頻的時候出來個鎖屏的介面進行鎖頻拉,我們還要想繼續看的話還要去解鎖,這樣好麻煩,不是我們想要 的,那我們該怎麼做呢,其實很簡單,我這裡只講其中的兩種
一 :我們只要在程式中用代碼實現。代碼如下:
[java:showcolumns:firstline[1]] view plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- //方法一
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.main);
- //方法二
- @Override
- protected void onResume() {
- super.onResume();
- pManager = ((PowerManager) getSystemService(POWER_SERVICE));
- mWakeLock = pManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
- | PowerManager.ON_AFTER_RELEASE, TAG);
- mWakeLock.acquire();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
-
- if(null != mWakeLock){
- mWakeLock.release();
- }
- }
- //方法三
- public void unLock(){
- mContentResolver = getContentResolver();
- //不建議使用
- //setLockPatternEnabled(android.provider.Settings.System.LOCK_PATTERN_ENABLED,false);
-
- //推薦使用
- setLockPatternEnabled(android.provider.Settings.Secure.LOCK_PATTERN_ENABLED,false);
- }
-
- private void setLockPatternEnabled(String systemSettingKey, boolean enabled) {
- //不建議使用
- //android.provider.Settings.System.putInt(mContentResolver,systemSettingKey, enabled ? 1 : 0);
-
- //推薦使用
- android.provider.Settings.Secure.putInt(mContentResolver, systemSettingKey,enabled ? 1 : 0);
- }
- //但注意要加許可權AndroidManifest.xml檔案中加入
- //<uses-permission android:name="android.permission.WRITE_SETTINGS" />
- //還要特別注意的是要加入 android:sharedUserId="android.uid.system",但有一個問題,
- //如果加入了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:collapse:showcolumns:firstline[1]] + expand sourceview plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
我們通過查看源碼便知道, 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:showcolumns:firstline[1]] view plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- <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:showcolumns:firstline[1]] view plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- /**
- * External apps (like the phone app) can tell us to disable the keygaurd.
- */
- private boolean mExternallyEnabled = true
mExternallyEnabled是用來管理是否開啟螢幕鎖的關鍵。預設值是開啟屏鎖,根據注釋可以知道他是希望應用程式來修改這個
值,我們可以把這個值改成false就可以了。
有時候我們不想修改這個初始值,那我們看看這個類有沒有提供相應的方法來供外部修改這個值的,不出我們所料,看下面這段代碼就是的了:
[java:showcolumns:firstline[1]] view plaincopy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- /**
- * Same semantics as {@link WindowManagerPolicy#enableKeyguard}; provide
- * a way for external stuff to override normal keyguard behavior. For instance
- * the phone app disables the keyguard when it receives incoming calls.
- */
- public void setKeyguardEnabled(boolean enabled) {
- synchronized (this) {
- if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")");
-
- mExternallyEnabled = enabled;
-
- if (!enabled && mShowing) {
- if (mExitSecureCallback != null) {
- if (DEBUG) Log.d(TAG, "in process of verifyUnlock request, ignoring");
- // we're in the process of handling a request to verify the user
- // can get past the keyguard. ignore extraneous requests to disable / reenable
- return;
- }
-
- // hiding keyguard that is showing, remember to reshow later
- if (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, "
- + "disabling status bar expansion");
- mNeedToReshowWhenReenabled = true;
- hideLocked();
- } else if (enabled && mNeedToReshowWhenReenabled) {
- ...
- ...
- }
- }
我們可以在我們需要修改這個值的地方來調用這個函數去修改,挺簡單的吧,OK,鎖頻就講到這裡,其實鎖屏這塊還有挺多的知識點.
要想深入的瞭解其實挺麻煩的,如果大家對鎖頻有了個比較深入的瞭解的話,可以嘗試自己開發一個瑣屏的程式看看。