1. 程式人生 > >音量下鍵和電源鍵截圖心得記錄

音量下鍵和電源鍵截圖心得記錄

按鍵先在PhoneWindowManager.java處理。

音量鍵:

case KeyEvent.KEYCODE_VOLUME_DOWN:
            case KeyEvent.KEYCODE_VOLUME_UP:
            case KeyEvent.KEYCODE_VOLUME_MUTE: {
                if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                    if (down) {
                        if (interactive && !mScreenshotChordVolumeDownKeyTriggered
                                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                            mScreenshotChordVolumeDownKeyTriggered = true;
                            mScreenshotChordVolumeDownKeyTime = event.getDownTime();
                            mScreenshotChordVolumeDownKeyConsumed = false;
                            cancelPendingPowerKeyAction();
                            interceptScreenshotChord();
                        }
                    } else {
                        mScreenshotChordVolumeDownKeyTriggered = false;
                        cancelPendingScreenshotChordAction();
                    }
                }

power鍵:
if (interactive && !mScreenshotChordPowerKeyTriggered
                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
            mScreenshotChordPowerKeyTriggered = true;
            mScreenshotChordPowerKeyTime = event.getDownTime();
            interceptScreenshotChord();
        }
其中 interceptScreenshotChord();就是控制截圖的程式碼
private void interceptScreenshotChord() {
        if (mScreenshotChordEnabled
                && mScreenshotChordVolumeDownKeyTriggered && mScreenshotChordPowerKeyTriggered
                && !mScreenshotChordVolumeUpKeyTriggered) {
            final long now = SystemClock.uptimeMillis();
            if (now <= mScreenshotChordVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS
                    && now <= mScreenshotChordPowerKeyTime
                            + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS) {
                mScreenshotChordVolumeDownKeyConsumed = true;
                cancelPendingPowerKeyAction();

                mHandler.postDelayed(mScreenshotRunnable, getScreenshotChordLongPressDelay());
            }
        }		
    }

為了防止截圖的時候音量下鍵生效出現調節音量的dialog,有

 if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                    && mScreenshotChordVolumeDownKeyConsumed) {
                if (!down) {
                    mScreenshotChordVolumeDownKeyConsumed = false;
                }
                return -1;
            }
以上是原始碼,如果要將組合鍵改為power鍵和home鍵:

在監聽到home鍵的地方加:

if (isScreenOn() && !mBackBtnDownKeyTriggered
                            && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                        mBackBtnDownKeyTriggered = true;
                        mBackkeyTime = event.getDownTime();
                        mBackDownKeyConsumedByScreenshotChord = false;
                        cancelPendingPowerKeyAction();
                        interceptScreenshotChord();
                    }
                }
interceptScreenshotChord();裡面的方法改為:
if (mBackBtnDownKeyTriggered && mScreenshotChordPowerKeyTriggered ) {
            final long now = SystemClock.uptimeMillis();
			//android.util.Log.i("cenon","interceptScreenshotChord  mBackkeyTime="+mBackkeyTime+"  now="+now+" mScreenshotChordPowerKeyTime="+mScreenshotChordPowerKeyTime);
            if (now <= mBackkeyTime+ SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS
                    && now <= mScreenshotChordPowerKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS) {
                //android.util.Log.i("cenon","mScreenshotRunnable post");
                mBackDownKeyConsumedByScreenshotChord = true;
                cancelPendingPowerKeyAction();

                mHandler.postDelayed(mScreenshotRunnable,
                        ViewConfiguration.getGlobalActionKeyTimeout());
            }
        }
為了防止截圖的時候音量下鍵生效出現調節音量的dialog,新增:
if (keyCode == KeyEvent.KEYCODE_HOME
                    && mBackDownKeyConsumedByScreenshotChord 
                    && android.provider.Settings.System.getInt(mContext.getContentResolver(), "home_button_layout_flag", 0) == 0) {//modified by wangyouyou
                if (!down) {
                    mBackDownKeyConsumedByScreenshotChord = false;
                }
                return -1;
            }

其實就是仿造原始碼寫,當然擡手的時候要將相應的boolen值改為false

注:對音量鍵的控制實際在PhoneWindow.java
protected boolean onKeyUp(int featureId, int keyCode, KeyEvent event) {
        final KeyEvent.DispatcherState dispatcher =
                mDecor != null ? mDecor.getKeyDispatcherState() : null;
        if (dispatcher != null) {
            dispatcher.handleUpEvent(event);
        }
        //Log.i(TAG, "Key up: repeat=" + event.getRepeatCount()
        //        + " flags=0x" + Integer.toHexString(event.getFlags()));

        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP:
            case KeyEvent.KEYCODE_VOLUME_DOWN: {
                final int flags = /*AudioManager.FLAG_PLAY_SOUND |*/ AudioManager.FLAG_VIBRATE // delete by csc
                        | AudioManager.FLAG_FROM_KEY;
                // If we have a session send it the volume command, otherwise
                // use the suggested stream.
                if (mMediaController != null) {
                    mMediaController.adjustVolume(0, flags);
                } else {
                    MediaSessionLegacyHelper.getHelper(getContext()).sendAdjustVolumeBy(
                            mVolumeControlStreamType, 0, flags);
                }
                return true;
            }
            case KeyEvent.KEYCODE_VOLUME_MUTE: {
                // Similar code is in PhoneFallbackEventHandler in case the window
                // doesn't have one of these.  In this case, we execute it here and
                // eat the event instead, because we have mVolumeControlStreamType
                // and they don't.
                getAudioManager().handleKeyUp(event, mVolumeControlStreamType);
                return true;
            }








相關推薦

音量電源心得記錄

按鍵先在PhoneWindowManager.java處理。 音量鍵: case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_VOLUME_UP: case KeyE

jQuery模擬按回車鍵f11

     眾所周知easyui 的Pagination中要想跳轉到某一頁,只需要輸入頁碼按ENTER就能達到效果。前段時間的專案 客戶提出要求說想要輸入頁碼 按一個GO的按鈕做跳轉。好吧,客戶是上帝,他們怎麼說我們這些程式猿只能儘自己所能來達到效果。如圖:         

鍵盤沒有HomeEnd的完美解決辦法

zha image 鉤子 正常 ctr 自己的 ctrl+h end alt 最近新入手一個筆記本,發現鍵盤沒有Home/End,這兩個鍵雖然不是必用,但也是用順手了,特別是選擇一行,到行首,行尾的時候甚是方便 作為一枚程序員,怎麽能夠妥協? 於是開始研究 方案一

關於主

主表 通過 更新 控制 數據緩沖 計算機 wid 但是 detail 數據庫主鍵和外鍵 1 什麽是主鍵 外鍵  學生表(學號,姓名,性別,班級)   學號是一個主鍵  課程表(課程號,課程名,學分)    課程號是一個主鍵  成績表(學號,課程號,成績)    

SQL server :主

技術分享 div 標識 reference create reat 按鈕 sse 是的 1.定義 1.1 什麽是主鍵和外鍵 1.2 主鍵和外鍵的作用 1.3 主鍵、外鍵和索引的區別 2.主鍵(primary key) 2.1 通過SSMS設置主鍵 2.2 通過SQL語

關於 主

tick not null 規則 更新 主鍵 join table 插入 out SQL的主鍵和外鍵的作用: 外鍵取值規則:空值或參照的主鍵值。 (1)插入非空值時,如果主鍵表中沒有這個值,則不能插入。 (2)更新時,不能改為主鍵表中沒有的值。 (3)刪除主鍵表記錄時,你可

如何在Windows安裝MYSQL,並說明

family CP 選擇 查找 報錯 mage 端口號 ron 訪問 說明 : window 下安裝 mysql 雖然簡單,但是細節不註意就會安裝失敗,特別是配置服務器時,Current Root Password:為空;如果輸入密碼了在後面安裝會報錯。(不知道設置這個密碼

MySQL資料庫中主外來的操作

在MySQL資料庫中,一般會涉及到主鍵和外來鍵,在上一個表中添加了主鍵之後,通常在下一個表中要新增外來鍵,但是添加了外來鍵之後,在實體類和資料庫中在加上上一個表的主鍵會比較好,這樣兩個表關聯之後,在上一個表查詢完成之後,將查詢是出來的欄位拿著去下一個庫裡查詢,會比較好。 select * fro

SQL的主外來約束

                SQL的主鍵和外來鍵的作用:    外來鍵取值規則:空值或參照的主鍵值。

第一篇:UE4如何輸出全景自定義

首先,向大家介紹一下UE4的兩種輸出全景圖的方法,一種是利用UE4自帶的輸出外掛,一種是NVIDIA的外掛 一、UE4自帶外掛 1、開啟Edit——>Plugins,選擇Stereo Panoramic Movie Capture外掛匯入 2、執行專案,

資料庫主外來及索引

1、主鍵: 若某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就是一個主鍵。主鍵不能重複,且只能有一個,也不允許為空。定義主鍵主要是為了維護關係資料庫的完整性。 2、外來鍵: 外來鍵用於與另一張表的關聯,是能確定另一張表記錄的欄位。外來鍵是另一個表的主鍵,可以重

vi編輯器方向backspace顯示不正常的解決辦法ubuntu的root密碼

網上看了很多方法,最簡單粗暴的莫過於改vim的配置檔案。方法如下: 首先改配置檔案要先切換到root賬戶,而今天使用ubuntu時想起來自己並沒有建立root賬號,更不用說密碼了。 然後我們只需要輸入 sudo passwd root 然後按提示輸入賬戶密碼,設定ro

selenium對指定元素進行

Selenium本身是可以支援截圖的,包括全屏和元素的截圖;只是對於不用的瀏覽器的相容性有差異而已。 具體差異如下: Chrome FireFox IE Edge PhantomJS 全屏截圖 可視區域 可視區域 可視

多次點選camera或者電源 調起app

當時這個需求是,連續點選camera鍵啟動掃碼app。由於怕和其他app共享一個廣播,所以自己定義了一個廣播 ACTION_CAMERA_BUTTON.DC 掃碼app監聽ACTION_CAMERA_BUTTON.DC這個廣播。 修改檔案 frameworks/base/p

一個Linux的adb 安卓指令碼

最近在真機除錯安卓,由於每次截圖儲存到電腦都要adb shell、adb pull,並且由於用的同一個命名導致後面的截圖會把前面的覆蓋掉,非常麻煩,因此寫了一個Linux下的通用指令碼,明顯提高了效率。

android螢幕view的

整個activity或者View元件顯示的內容可以通過cache機制儲存為bitmap, 使用到的api有     void  setDrawingCacheEnabled(boolean flag),     Bitmap  getDrawingCache(boolea

關於資料庫主外來(終於弄懂啦)

一、什麼是主鍵、外來鍵: 關係型資料庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵比如學生表(學號,姓名,性別,班級) 其中每個學生的學號是唯一的,學號就是一個主鍵課程表(課程編號,課程名,學分) 其中課程編號是

SQL SERVER 主外來中的 級聯刪除(ON DELETE CASCADE)級聯更新(ON UPDATE CASCADE)

建立學生表 create table gh_student( stuno varchar(3) primary key, stuname varchar(4), stuclass varchar(3) ) 插入資料 insert into gh_student values

外來

1.定義 1.1 什麼是主鍵和外來鍵 1.2 主鍵和外來鍵的作用 1.3 主鍵、外來鍵和索引的區別 2.主鍵(primary key) 2.1 通過SSMS設定主鍵 2.2 通過SQL語句設定主鍵 3.外來鍵(

SQL的主外來的作用

SQL 的主鍵和外來鍵的作用:外來鍵取值規則:空值或參照的主鍵值 (1)插入非空值時,如果主鍵值中沒有這個值,則不能插入。 (2)更新時,不能改為主鍵表中沒有的值。 (3)刪除主鍵表記錄時,可以在建外來鍵時選定外來鍵記錄一起聯刪除還是拒絕刪除。 (4)更新主鍵記錄時,同樣有級聯更新和拒絕執行的選擇。 簡而言之