android系統取消自動鎖定屏幕

android系統取消自動鎖定屏幕

 本文來自:安卓航班網

http://www.cnblogs.com/yyq-quan/archive/2011/07/18/2109952.html

鎖定屏幕對於移動終端來說是非常有必要的,但是對於機頂盒產品就沒有這個必要了。所以本文介紹一下怎樣讓Android設備永不鎖屏。 Android系統的鎖屏時間存放在Setting數據庫中,字段爲Settings.System.SCREEN_OFF_TIMEOUT。查看SettingsProvider源碼,查看如下文件的源碼:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java查看loadSystemSettings()函數的代碼如下:private void loadSystemSettings(SQLiteDatabase db) {SQLiteStatement stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"+ " VALUES(?,?);");Resources r = mContext.getResources();loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,R.bool.def_dim_screen);loadSetting(stmt, Settings.System.STAY_ON_WHILE_PLUGGED_IN,"1".equals(SystemProperties.get("ro.kernel.qemu")) ? 1 : 0);loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,R.integer.def_screen_off_timeout);// Set default cdma emergency toneloadSetting(stmt, Settings.System.EMERGENCY_TONE, 0);// Set default cdma call auto retryloadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0);// Set default cdma DTMF typeloadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);// Set default hearing aidloadSetting(stmt, Settings.System.HEARING_AID, 0);// Set default tty modeloadSetting(stmt, Settings.System.TTY_MODE, 0);loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON,R.bool.def_airplane_mode_on);loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_RADIOS,R.string.def_airplane_mode_radios);loadStringSetting(stmt, Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS,R.string.airplane_mode_toggleable_radios);loadBooleanSetting(stmt, Settings.System.AUTO_TIME,R.bool.def_auto_time); // Sync time to NITZloadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,R.integer.def_screen_brightness);loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,R.bool.def_screen_brightness_automatic_mode);loadDefaultAnimationSettings(stmt);loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,R.bool.def_accelerometer_rotation);loadDefaultHapticSettings(stmt);stmt.close();}複製代碼 從代碼中我們可以看出,假如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的定義。60000發現默認值爲60000ms,也就是60s。我們只需要把這個參數改爲-1。然後重新編譯SettingsProvider模塊,就OK了。 另外爲了防止用戶進入系統後,修改鎖屏時間,在Setting模塊中刪除對鎖屏時間的設置。這樣Android設備就永不鎖屏了。後來發現我的Android設備燒錄好之後第一次啓動永遠不會鎖屏,但是設備重啓之後開機就進入鎖屏狀態,解鎖之後就再也不會鎖屏了(因爲永遠不超時)。看來“革命尚未成功,同志仍需努力”啊。 那麼爲什麼啓動之後沒有進入鎖屏狀態呢?是不會系統有把超時鎖屏的值給修改了呢?我通過sqlite3去查看settings.db的內容,發現超時鎖屏的值仍然是-1。說明啓動之後,系統並沒有去數據庫中查看屏幕超時鎖屏的值,就直接鎖屏了。 但是怎樣才能開機之後不進入鎖屏狀態呢?這個是個非常費思量的問題。經過go,我知道鎖屏的代碼在LockScreen.java中,然後順藤摸瓜,終於找到了可以設置鎖屏功能開關的位置。代碼位於:frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java該文件中有一個變量定義如下: /** * External apps (like the phone app) can tell us to disable the keygaurd. */ private boolean mExternallyEnabled = true;mExternallyEnabled是用來管理是否開啓屏幕鎖的關鍵。默認值是打開屏鎖,根據註釋可以知道他是希望應用程序來修改這個值。但是經過加打印信息發現開機的時候沒有任何應用程序會修改它。修改這個值調用如下函數: /*** 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 / reenablereturn;}// hiding keyguard that is showing, remember to reshow laterif (DEBUG) Log.d(TAG, "remembering to reshow, hiding keyguard, "+ "disabling status bar expansion");mNeedToReshowWhenReenabled = true;hideLocked();} else if (enabled && mNeedToReshowWhenReenabled) {// reenabled after previously hidden, reshowif (DEBUG) Log.d(TAG, "previously hidden, reshowing, reenabling "+ "status bar expansion");mNeedToReshowWhenReenabled = false;if (mExitSecureCallback != null) {if (DEBUG) Log.d(TAG, "onKeyguardExitResult(false), resetting");mExitSecureCallback.onKeyguardExitResult(false);mExitSecureCallback = null;resetStateLocked();} else {showLocked();// block until we know the keygaurd is done drawing (and post a message// to unblock us after a timeout so we don't risk blocking too long// and causing an ANR).mWaitingUntilKeyguardVisible = true;mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_DRAWING, KEYGUARD_DONE_DRAWING_TIMEOUT_MS);if (DEBUG) Log.d(TAG, "waiting until mWaitingUntilKeyguardVisible is false");while (mWaitingUntilKeyguardVisible) {try {wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}if (DEBUG) Log.d(TAG, "done waiting for mWaitingUntilKeyguardVisible");}}}}複製代碼 經過上面的討論我們可以發現我們有兩個解決方法: 1、定義變量的時候,給其初始化爲false。 2、在launcher模塊啓動的時候,調用setKeyguardEnabled方法,關閉鎖屏功能。 我懶得修改Laucher模塊,我的解決方法就是在定義mExternallyEnabled時修改其初始值爲false。各位朋友可以根據自己的實際情況選擇解決方案。我的代碼如下:/*** External apps (like the phone app) can tell us to disable the keygaurd.*/private boolean mExternallyEnabled = false;複製代碼 這樣修改之後,Android設備開機之後,默認不會進入鎖屏狀態,除非你在應用程序中調用setKeyguardEnabled方法顯示打開這個功能。因爲設置的超時時間爲-1,則永遠也不會進入鎖屏界面。完全滿足了我的需求,終於大功告成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章