Android解除屏幕鎖的方法.doc_第1頁
Android解除屏幕鎖的方法.doc_第2頁
Android解除屏幕鎖的方法.doc_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第一個(gè)方法:窗體頂端窗體底端Android修改源代碼控制永不鎖屏 鎖定屏幕對(duì)于移動(dòng)終端來說是非常有必要的,但是對(duì)于機(jī)頂盒產(chǎn)品就沒有這個(gè)必要了。所以本文介紹一下怎樣讓Android設(shè)備永不鎖屏。 Android系統(tǒng)的鎖屏?xí)r間存放在Setting數(shù)據(jù)庫中,字段為Settings.System.SCREEN_OFF_TIMEOUT。查看SettingsProvider源碼,查看如下文件的源碼: frameworks/base/packages/SettingsProvider/src/com/Android/providers/settings/DatabaseHelper.java 查看loadSystemSettings()函數(shù)的代碼如下: private void loadSystemSettings(SQLiteDatabase db) SQLiteStatement stmt = pileStatement(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 tone loadSetting(stmt, Settings.System.EMERGENCY_TONE, 0); / Set default cdma call auto retry loadSetting(stmt, Settings.System.CALL_AUTO_RETRY, 0); / Set default cdma DTMF type loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0); / Set default hearing aid loadSetting(stmt, Settings.System.HEARING_AID, 0); / Set default tty mode loadSetting(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 NITZ loadIntegerSetting(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沒有初始化的話(系統(tǒng)首次啟動(dòng),這個(gè)字段肯定是沒有初始化的),將會(huì)利用資源中的R.integer.def_screen_off_timeout來初始化。我們?yōu)榱俗屜到y(tǒng)永不鎖屏,只需要把資源 R.integer.def_screen_off_timeout設(shè)為-1即可。查看文件 frameworks/base/packages/SettingsProvider/res/values/defaults.xml 可以找到R.integer.def_screen_off_timeout的定義。 60000 發(fā)現(xiàn)默認(rèn)值為60000ms,也就是60s。我們只需要把這個(gè)參數(shù)改為-1。然后重新編譯SettingsProvider模塊,就OK了。另外為了防止用戶進(jìn)入系統(tǒng)后,修改鎖屏?xí)r間,在Setting模塊中刪除對(duì)鎖屏?xí)r間的設(shè)置。這樣Android設(shè)備就永不鎖屏了。后來發(fā)現(xiàn)我的Android設(shè)備燒錄好之后第一次啟動(dòng)永遠(yuǎn)不會(huì)鎖屏,但是設(shè)備重啟之后開機(jī)就進(jìn)入鎖屏狀態(tài),解鎖之后就再也不會(huì)鎖屏了(因?yàn)橛肋h(yuǎn)不超時(shí))??磥怼案锩形闯晒?,同志仍需努力”啊。那么為什么啟動(dòng)之后沒有進(jìn)入鎖屏狀態(tài)呢?是不會(huì)系統(tǒng)有把超時(shí)鎖屏的值給修改了呢?我通過sqlite3去查看settings.db的內(nèi)容,發(fā)現(xiàn)超時(shí)鎖屏的值仍然是-1。說明啟動(dòng)之后,系統(tǒng)并沒有去數(shù)據(jù)庫中查看屏幕超時(shí)鎖屏的值,就直接鎖屏了。但是怎樣才能開機(jī)之后不進(jìn)入鎖屏狀態(tài)呢?這個(gè)是個(gè)非常費(fèi)思量的問題。經(jīng)過go,我知道鎖屏的代碼在LockScreen.java中,然后順藤摸瓜,終于找到了可以設(shè)置鎖屏功能開關(guān)的位置。代碼位于: frameworks/policies/base/phone/com/Android/internal/policy/impl/KeyguardViewMediator.java 該文件中有一個(gè)變量定義如下: /* * External apps (like the phone app) can tell us to disable the keygaurd. */ private boolean mExternallyEnabled = true; mExternallyEnabled是用來管理是否開啟屏幕鎖的關(guān)鍵。默認(rèn)值是打開屏鎖,根據(jù)注釋可以知道他是希望應(yīng)用程序來修改這個(gè)值。但是經(jīng)過加打印信息發(fā)現(xiàn)開機(jī)的時(shí)候沒有任何應(yīng)用程序會(huì)修改它。修改這個(gè)值調(diào)用如下函數(shù): /* * 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); / were 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) / reenabled after previously hidden, reshow if (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 dont 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); 經(jīng)過上面的討論我們可以發(fā)現(xiàn)我們有兩個(gè)解決方法: 1、定義變量的時(shí)候,給其初始化為false。 2、在launcher模塊啟動(dòng)的時(shí)候,調(diào)用setKeyguardEnabled方法,關(guān)閉鎖屏功能。我懶得修改Laucher模塊,我的解決方法就是在定義mExternallyEnabled時(shí)修改其初始值為false。各位朋友可以根據(jù)自己的實(shí)際情況選擇解決方案。我的代碼如下: /* * External apps (like the phone app) can tell us to disable the keygaurd. */ private boolean mExternallyEnabled = false; 這樣修改之后,Android設(shè)備開機(jī)之后,默認(rèn)不會(huì)進(jìn)入鎖屏狀態(tài),除非你在應(yīng)用程序中調(diào)用setKeyguardEnabled方法顯示打開這個(gè)功能。因?yàn)樵O(shè)置的超時(shí)時(shí)間為-1,則永遠(yuǎn)也不會(huì)進(jìn)入鎖屏界面。完全滿足了我的需求,終于大功告成了。第二個(gè)方法:*1. 在需要自動(dòng)啟動(dòng)的程序的Activity中加入幾行代碼就可以了:KeyguardManager km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);/得到鍵盤鎖管理器對(duì)象KeyguardLock kl = km.newKeyguardLock(unLock); /參數(shù)是LogCat里用的Tagkl.disableKeyguard(); /解鎖PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);/獲取電源管理器對(duì)象PowerManager.WakeLock wl = pm.ne

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論