1. 程式人生 > >Android 高通8909 系統之路之 裁剪系統 一

Android 高通8909 系統之路之 裁剪系統 一

鎖定螢幕對於移動終端來說是非常有必要的,但是對於機頂盒產品就沒有這個必要了。所以本文介紹一下怎樣讓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 8909 系統 裁剪系統

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

Android+ MIPI轉LVDS顯示屏除錯---基於SD65DSI84

1.硬體介面顯示屏解析度是1920×RGB×1080 pixels。1.1 硬體連線示意圖1.2 硬體連線引腳CPU SN65DSI84 DSI轉LVDS LM3492HCMH 背光控制IC 顯示屏 GPIO126_LCD_1V8_EN VCC GPIO1

Android——4.2 - 3G移植 reference-ril .pppd 撥號上網 (三)

而且 init.rc nal null ann 源代碼分析 suggest cdma 初始化 Android的RIL機制中的 reference-ril.c 即為廠商提供的驅動接口。這個驅動源代碼各個廠商都是有提供的,網上也有下載。我如今用的就是huawe

Linux學習-Linux自動化系統安裝【12】---20171230

repos exec auth bdc u盤啟動 eth 本地 ner 微型linux 安裝程序 CentOS系統安裝 系統啟動流程:bootloader-->kernel(initramfs)-->rootfs-->/sbin/initanaco

聯想拯救者Y7000系統安裝(Win10系統

最近新購得聯想拯救者Y7000,到手的第一件事情就是重灌系統,這個大家都懂的~~ 使用F2進入BIOS介面,使用F12可進入快速啟動選擇U盤啟動。接下來問題來了,我用老毛桃製作的U盤啟動盤,進入後就提示ACPI BIOS Error。度娘了下,說通常是因為主機板BIOS不能很好的支援ACPI

Android 小白 的 學習 阿里雲上 Tomcat Web伺服器的搭建以及配置

1 、擁有一個自己的阿里雲ESC伺服器(因為我的是windows server 這裡就以我自己的為例) 2 、在阿里雲伺服器下載並且安裝 java jdk  3、配置環境變數  

Android NDK學習起航先買艘船

      感覺Android寫了這麼久了, 也該學點裝逼的技能了。所以我把目光放在了NDK和C++上,只要玩轉了這兩個, 我就能去玩OpenCV和TensorFlow了,想想就美滋滋。今天先來基礎配置一個最簡單的NDK環境。基於AndroidStudio 3.2,使用Cma

安卓高手圖形系統(6)requestLayout的流程

當一個View呼叫requestLayout的時候,會給當前的View設定一個FORCE_LAYOUT標記。由此向ViewParent請求佈局。這樣從這個View開始向上一直requestLayout。最終到達ViewRootImpl。ViewParent 就是當前的傳輸

演算法工程師修仙:推薦系統實踐(

第一章 好的推薦系統 什麼是推薦系統 隨著資訊科技和網際網路的發展,人們逐漸從資訊匱乏的時代走入了資訊過載(information overload)的時代。在這個時代,無論是資訊消費者還是資訊生產者都遇到了很大的挑戰:作為資訊消費者,如何從大量資訊中找到自己感興趣的

程式設計菜鳥到大佬:資料庫系統概論(

基礎篇 初識資料庫系統 資料庫的4個基本概念 資料庫系統的發展經歷了三代演變 層次/網狀資料庫系統、關係資料庫系統、新一代資料庫系統。 資料庫是一個巨大的軟體產業:理論創立–>原型研製–>產品上市–>經濟效

python3自學作業 選課系統

本節作業:選課系統角色:學校、學員、課程、講師要求: 1. 建立北京、上海 2 所學校 2. 建立linux , python , go 3個課程 , linux\py 在北京開, go 在上海開 3. 課程包含,週期,價格,通過學校建立課程 4. 通過學校建立班級, 班級

Android高手獲取正在執行的service,以及判斷某個service是否正在執行

注:本文改自http://blog.csdn.net/android_tutor/article/details/5824581 其實主要是用了activityManager的getRunningServices來獲取正在執行的service的列表。然後用正在執行的服務的名

sensor架構例項分析三(adsp上報資料詳解、校準流程詳解)

本系列導航: 從adsp獲取資料的方法分為同步、非同步兩種方式,但一般在實際使用中使用非同步方式,因為同步獲取資料會因外設匯流排速率低的問題阻塞smgr,降低效率,增加功耗。 Sensor上報資料的方式分為如下幾種 sync          同步資料上報,(每次上報一個數據) async      

iOS基礎系統預設字型

中文字型: iOS 9 中文字型是"蘋方"。 iOS 8 中文字型是"常州華文的黑體-簡"。 英文字型:Helvetica。 如果你是iOS Developer,你在程式設計時使用的預設簡體中文字型,

我的學習_第十章_字符流

之間 才會 fileutil output keys 返回 ont 讀取數據 一個 【字符流】 IO流的分類 ★字節流 操作的文件不是文本文件 字節輸入流: InputStream 抽象類 FileInputStream操作文件的字節輸入流 字節輸出流: OutputStr

vuex實踐——筆記本應用(

time 中大 -- this 隔離 思想 一個表 環境搭建 一定的 首先使用vue-cli把環境搭建好。 介紹一下應用的界面。 App.vue根組件,就是整個應用的最外層 Toolbar.vue:最左邊紅色的區域,包括三個按鈕,添加、收藏、刪除。 NoteList.vu

相信自己,看著目標前進——我的信息技術

鄰居 技術 自己 直接 歷程 互聯網 努力 刻錄 一個人   大家好,今天繼續回顧我與信息技術結緣至今的心路歷程。   如前面所說,我真正開始“玩”電腦是在一個沒有網絡的鄉村學校開始的,甚至電力都不穩定,停電是家常便飯,我心愛的幾千元的電腦是經不這種不穩定的電壓折騰的,為此

時間與效率——我的信息技術

分析 最可 興趣 大量 人做 機器 助手 個性 進度   雖然因為受興趣與愛好的“逼迫”,我才拼命地學習信息技術,特別是學習程序設計,嚴重損害了我的眼睛,使其極為近視與視力模糊,但總的說來我還是感到幸運,能夠從0的基礎實現到如今可以隨時滿足自己任意輔助工具的需求。   當年

我眼中的人人都需要學點編程——我的信息

設計時 ogr 大學 電子 class 程序 收費 學生 自己的   近來網絡上開始流行一種說法——“人人都需要學點兒編程”,各種正式的,專業的解釋非常之多,但那些高大上的說明未必人人都能深刻理會,這幾天我在不斷反省自己的編程學習之路時,也領悟到,是的,人人都需要學點編程—

No.11 selenium學習瀏覽器大小

bsp selenium img es2017 nbsp ges 最大 blog 技術分享 通過set_window_size()方法可以設置打開的瀏覽器大小 maximize_window()方法可以把當前瀏覽器最大化 例子: No.11 selenium學習之路之瀏