1. 程式人生 > >Android修改原始碼控制永不鎖屏

Android修改原始碼控制永不鎖屏

鎖定螢幕對於移動終端來說是非常有必要的,但是對於機頂盒產品就沒有這個必要了。所以本文介紹一下怎樣讓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 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沒有初始化的話(系統首次啟動,這個欄位肯定是沒有初 始化的),將會利用資源中的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的定義。
<integer name="def_screen_off_timeout">60000</integer>
發現預設值為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 / 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 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,則永遠也不會進入鎖屏介面。完全滿足了我的需求,終於大功告成了。開心啊~!!

相關推薦

Android修改原始碼控制永不

鎖定螢幕對於移動終端來說是非常有必要的,但是對於機頂盒產品就沒有這個必要了。所以本文介紹一下怎樣讓Android裝置永不鎖屏。Android系統的鎖屏時間存放在Setting資料庫中,欄位為Settings.System.SCREEN_OFF_TIMEOUT。檢視SettingsProvider原始碼,檢視如

Android安全學習筆記1——密碼方式

前言 在Android安全學習中,我接觸到第一個例子是鎖屏密碼。我們日常使用手機的時候使用最多的鎖屏密碼是怎麼構成的?下面分享一下我接觸到的知識。 鎖屏密碼的思考 為了安全,Android裝置在解鎖螢幕時會有密碼輸入,那麼在這個密碼存放在哪裡?是否為明文儲存?如果是加密儲存,

android O如何獲取當前狀態

以下程式碼在Android O驗證可行。 主要作用:獲取當前是否處於鎖屏狀態。 主要是呼叫KeyguardManager裡面的介面,同樣可以使用其他介面判斷當前是否是安全鎖屏等。 import android.app.KeyguardManager; KeyguardMan

Android螢幕禁止休眠和的方法

Android螢幕禁止休眠的方法  實現這一功能的方法有兩種,一種是在Manifest.xml檔案裡面宣告,一種是在程式碼裡面修改LayoutParams的標誌位。具體如下: 1、在Manifest.xml檔案裡面用user-permission宣告。程式碼如下:    

android 螢幕保持喚醒 不

之前的一個社群PDA專案在採集使用者座標這個功能的時候,需要保持螢幕常亮,面對未涉及過的東西,網路是最好的學習工具,便去找相關的資料,發現原來可以使用PowerManager.WakeLock來實現要求的功能,以下的文字部分轉載自網路上的一篇有關部落格,感覺寫的還比較清楚,可以學習並用來寫到專案中,原文連結。

android黑科技系列——修改密碼和惡意機樣本原理分析

無需 功能 log 輔助 數據庫文件 手勢密碼 安全網 樣式 進制 一、Android中加密算法 上一篇文章已經介紹了Android中系統鎖屏密碼算法原理,這裏在來總結說一下: 第一種:輸入密碼算法 將輸入的明文密碼+設備的salt值,然後操作MD5和SHA1之後在轉

android形狀屬性、密碼、動態模糊、kotlin專案、抖音動畫、記賬app、視訊播放器等原始碼

Android精選原始碼 直觀瞭解Android的“形狀”屬性如何影響Drawable的外觀。 一個靈活的視訊播放器, 可替換播放器核心。 android鎖屏輸入密碼功能原始碼 背景動態模糊方案,元件實現類對bitmap模糊處理的各類算... 簡單天氣,帶

Android監聽Home鍵、、解(落雨敏詳細講解)附原始碼

     前言:最近做視訊播放,發現當在播放時點選電源鍵進行鎖屏,視訊繼續播放問題,於是通過廣播進行監聽。廣播監聽可以用於很多地方,在此落雨敏詳細講解Home鍵、鎖屏、解屏的事件處理。先講解思路,然後在一步一步實現,下面會貼出所有程式碼。   &nbs

Android實現自定義控制

   當在Android手機上需要實現自定義的鎖屏,  往往在進入自定義的鎖屏介面介面之前需要先解開螢幕鎖, 以順利的進入自定義鎖屏介面 ,並能方便使用者即時的做其他操作,下面用程式碼來實現這一功能:  1、點亮螢幕與解系統鎖 //light the screen Pow

Android端惡意勒索應用分析

oid recovery 界面啟動 沒有 apk反編譯 人的 一律 reset 臺電腦 一、前言 5月12日,一場全球性互聯網災難悄然而至,一款名為WannaCRY的PC端惡意勒索軟件利用NSA泄漏的危險漏洞“永恒之藍”,給100多個國家和地區10

Android密碼算法解析以及破解方案

.net water mda 介紹 數據 watermark 悲劇 ids 界面 一、前言 最近玩王者榮耀,下載了一個輔助樣本,結果被鎖機了,當然破解它很簡單,這個後面會詳細分析這個樣本,但是因為這個樣本引發出的欲望就是解析Android中鎖屏密碼算法,然後用一種高效的方式

Android 7.1.1 界面啟動流程

gis eset sed reset ram 啟動流程 com enter on() 前幾天遇到一個低概率復現鎖屏界面不顯示,僅僅顯示狀態欄的問題,跟了下鎖屏界面啟動顯示的流程,在這分享下,也方便以後自己查看。前面簡介了下Zygote啟動流程, Zygo

Android 7.0 以上保留數據去除密碼的方法

ngs idt ech auto 密碼加密 方法 b- mar jpg 在很多情況下,由於我們的疏忽,導致忘記了鎖屏密碼。也沒有開啟 USB 調試,內置存儲中還有要保留的數據。我們需要在不清除數據的情況下刪除鎖屏密碼。接下來我們就介紹該如何做。 註意事項 首先要註意

android------(手機啟動出現界面)

自定義 urn 一起 alt 點擊下載 tac ces roi class 以前用過一個紅包鎖屏的軟件,第一次打開手機出現鎖屏,滑動領取收益,當時覺得這功能不錯,就查閱資料,寫了一個案例, apk運行流程: 進入軟件---》啟動服務---》關閉手機(可先退出應用)--》

Android 監聽&用戶解

clas 開始 ets adc spa contex screen context scree 在做視頻播放器的時候,遇到一個問題,在用戶播放視頻然後鎖屏之後,視頻播放器仍然在繼續播放,遇到類似手機系統狀態改變的問題的時候,首先想到了廣播,下面做個總結: public

[Android病毒分析]病毒之免流伺服器

鎖屏病毒之免流伺服器 一、 樣本概況 1.1 樣本資訊 檔名稱:免流伺服器.apk 檔案型別:application/jar 樣本包名:zs.ip.proxy 樣本大小:782KB MD5:2EFCA46F34A565C2EF4052B89B6B364B SHA1:5493A95

[Android病毒分析]病毒之百變氣泡

鎖屏病毒之百變氣泡 一、樣本概況 1.1 樣本分析 檔名稱:百變氣泡 檔案型別:application/jar 樣本包名:Aaron.tencent.kou 樣本大小:287KB MD5:e7c653a4195cd36f27933b4ef1fe8328 SHA1:126B25E8

Android密碼演算法解析以及破解方案

本文轉自一個牛逼的博主,最下是他的二維碼,原博地址:http://blog.csdn.net/jiangwei0910410003/article/details/74886918  一、前言 最近玩王者榮耀,下載了一個輔助樣本,結果被鎖機了,當然破解它很簡單

android 滑動狀態下如何禁止下拉狀態列

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

[android adb shell] 怎麼解圖案(pattern lock)的手機?

所謂的防水手機由於沖洗螢幕進水而觸控失靈了,幸好adb是開啟的,還能用usb連上,然而問題來了,我加了圖案鎖屏,雖然adb shell能進,但死活操作不了啊。。。 首先,要確定觸控事件的裝置,我的手機是event2 其次,解析度肯定得搞清楚,可參考 https://blog.csd