當前位置:首頁 » 安卓系統 » android監聽鍵盤收起

android監聽鍵盤收起

發布時間: 2024-11-02 16:56:21

① Android怎樣監聽藍牙耳機的按鍵事件

其實對於Android系統,每次按鍵只會有一個唯一「鍵值」響應,使用起來感覺會模模糊糊的,但是其實對於系統來說是很清晰的。

AVRCP全稱(Audio/VideoRemoteControlProfile),是藍牙協議中的一個profile。從名字上就可以看出主要應用於Audio/Video控制。每個按鍵並不是獨立的,上-曲/下一曲是在正在播放音樂的時候才會有效,即才會向Android發送「鍵值」。

基於按鍵從Linux到Android分析具體對於的鍵值:

Linux掃描碼功能映射字串Android鍵值

00c8200 開始放音樂MEDIA_PLAYKEYCODE_MEDIA_PLAY

00c9201 停止放音樂MEDIA_PAUSEKEYCODE_MEDIA_PAUSE

00a3163 下一曲MEDIA_NEXTKEYCODE_MEDIA_NEXT

00a5165 上-曲MEDIA_PREVIOUSKEYCODE_MEDIA_PREVIOUS

Android應用代碼,完整測試應用:TeskKey。

總結:1號鍵會交替發送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE;2/3號鍵會在播放音樂時分別發送KEYCODE_MEDIA_PREVIOUS/.KEYCODE_MEDIA_NEXT。如果想要把藍牙耳機上的按鍵利用起來,可以在接收到KEYCODE_MEDIA_PLAY時播放無聲音樂以使能2/3號鍵。這樣就能完整接收3種鍵值了自行控制了。這個具體自行設計(測試代碼已經更新包含了)。

註:這種實現並不一定通用,比如我在深度定製的MIUI中測試,盡管啟動的TestKey應用,系統自帶的音樂播放器仍然能同時響應鍵值。

更新:

已經更新TestKey源碼,添加對藍牙耳機按鍵的監聽,實現方法就是上述中推測的方法,已經成功驗證過了。播放音樂參考《Android多媒體開發--資源文件播放》。效果圖:


問與答
1.這個只能在播放音樂的狀態下才能監聽到么?
答:根據上述的原理,這些按鍵也僅僅是應用在控制媒體時使用;且根據實際驗證沒有播放音樂時藍牙耳機的2/3號鍵是並沒有向Android設備發送鍵值(從底層Linux來看)。綜上所述,需要通過播放音樂來實現激活其向Android設備發送鍵值,針對這種情況可以播放一個「沒有聲音」的音樂文件來實現,這樣既可以監聽到2/3號鍵又可以不影響其它聲音的輸出。可以在前台時播放音樂,後台停止播放。

2.我現在主要是想監聽得到開關鍵(1號鍵)。 在做一個按下藍牙開關鍵後啟動一個語音識別的功能?
答:在我的測試條件下,1號鍵是可以正常監聽到的。1號鍵會交替發送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE鍵值。這個鍵不需要模擬播放音樂就可以正常的監聽到。

3.4號按鍵的監聽方法

答:所謂的4號按鍵,也就是指本文中的所測試型號的藍牙耳機上並沒有,但有可能其它型號的藍牙耳機上有。我沒有辦法測試驗證,所以這里就簡單敘述一下「新按鍵」的鍵值確定思路:1.先使用TestKey測試應用測試按鍵,測試Android上層是否可以得到對應鍵值。2.如果沒有得到,那麼就使用adbshellgetevent來看Linux底層可以不可以得到鍵值。然後根據按鍵從Linux到Android來確定Android上層使用的鍵值碼到底是多少。(當然,如果你實在不知道如何監聽,把藍牙耳機寄給我,我給你確定也行。:))

註:其實上述文章完全是根據按鍵從Linux到Android測試確定下來的。那是篇文章是剝開Android外殼來看「按鍵」事件的流程的,方法適用於所有輸入事件:各種按鍵/觸摸/物理鍵盤/滑鼠等待輸入設備。沒有一定的Linux開發經驗很難看懂和理解。

4.Android後台監聽按鍵怎麼實現

或:如何啟動一次應用後在後台一直監聽播放鍵因為有這樣一個場景在用戶開車的時候需按一下開關鍵就啟動語音識別的功能。

這個問題其實已經超出了本文討論的范圍,是Android系統對應用層的鍵盤事件(按鍵)的分發的問題了。正常情況下,按鍵只會向當前最端的應用分發鍵盤事件,也就是說在後台你邊音量鍵都監聽不了。

但是既然這種情況(後台應用監聽按鍵)的需求存在,那麼就一定有它存在的道理。比如「相機鍵」,按下後直接調出相機到最前台。從表面上看是相機響應了按鍵,但是從實現方法上來看,並不是通過鍵值來操作,必須通過其它方法,比如廣播或者其它等等。

明白了其中的道理後,那麼想要實現就好辦了。先看這個按鍵有沒有廣播,如要有接聽系統中發出來的廣播;如果沒有那麼對於定製系統可以自己在系統中添加一個廣播;總之,正常渠道是沒有辦法在後台監聽一些不應該是你監聽到的按鍵的。

更:查了一下,這個按鍵是有廣播的。這樣就可以後台響應了(不需要C/不需要root)。例子我就不試了,見Android官方例子RandomMusicPlayer。

其中的重點是這個廣播android.intent.action.MEDIA_BUTTON。

② 如何在android 中service後台監聽按鍵,比如監聽音量鍵

為了實現鍵盤的監控,從新開發一個輸入法是不現實的,一般的操作就是在系統的輸入法機制中添加介面回調。我們知道,再應用程序中拿到按鍵的回調一般是監聽onKeyDown的介面,如下所示:publicbooleanonKeyDown(intkeyCode,KeyEventevent)開發者就可以根據回調方法中的參數,keyCode與KeyEvent來判斷具體事件。但是,由於事件的回調機制在其的沙箱中運行,在其他應用中是無法拿到當前應用事件回調的。那麼我們就從上到下,具體的看看事件的傳遞機制。如下圖所示,用戶點擊後,軟鍵盤或物理按鍵的輸入驅動就會產生一個中斷,且向/dev/input/event*中寫入一個相應的信號量。Android操作系統則會循環的讀取其中的事件,再分發給WindowManagerServer。由WindowManagerServer根據事件的來源分發到各個不同的ViewGroup與View中,從而產生不同的OnClick、OnKeyDown和OnTouch等事件。這個時候很自然的想到,黑客們希望做鍵盤監控,一定會向Linux底層增加自定義的事件。這里我們使用的是Linux中的getevent獲得/dev/input/eventX設備匯報的事件,這個命令還會輸出所有event設備的基本信息。包括觸屏、按鍵、耳機插入等等。其基本用法如下:Usage:getevent[-t][-n][-sswitchmask][-S][-v[mask]][-d][-p][-i][-l][-q][-ccount][-r][device]-t:showtimestamps-n:don'tprintnewlines-s:printswitchstatesforgivenbits-S:printallswitchstates-v:verbositymask(errs=1,dev=2,name=4,info=8,vers=16,pos.events=32,props=64)-d:showHIDdescriptor,ifavailable-p:showpossibleevents(errs,dev,name,pos.events)-i:-l:-q:quiet(clearverbositymask)-c:-r:printrateeventsarereceived鍵入getevent後,我們能夠看到設備中的一些列輸入硬體驅動信息,同樣下面會出現很多輸入指令信號,通常情況下,這些信號量都在刷屏,如下圖所示:這些信號量的表示我們無法直接看懂,輸入getevent–l加入Label我們能夠看到一些添加的標簽,如下所示:其實這些Lable已經在其input.h頭文件中定義好,其中type的定義如下:/**Eventtypes*/#defineEV_SYN0x00#defineEV_KEY0x01#defineEV_REL0x02#defineEV_ABS0x03#defineEV_MSC0x04#defineEV_SW0x05#defineEV_LED0x11#defineEV_SND0x12#defineEV_REP0x14#defineEV_FF0x15#defineEV_PWR0x16#defineEV_FF_STATUS0x17#defineEV_MAX0x1f#defineEV_CNT(EV_MAX+1)一般來說,常用的是EV_KEY、EV_REL、EV_ABS、EV_SYN,分別對應鍵盤按鍵、相對坐標、絕對坐標、同步事件。EV_SYN則表示一組完整事件已經完成,需要處理,EV_SYN的code定義事件分發的類型。

③ Android 點擊空白或滑動時候關閉軟鍵盤(有scrollview的坑)

1、一般來說直接傳parent_resid就可以了。但是!!!
2、scrollview不能onclick監聽,但是要監聽他的點擊和滑動就得用ontouch監聽
3、如果parent下有個差不多佔據整個屏幕的scrollview請傳scrollview_resid比較好,因為parent_resid被遮擋了,監聽不到。。。

④ android 開發 如何獲取全局按鍵記錄

通過鍵盤監聽來實現:
Activity中重寫這個方法:
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//記住這個按鍵
}
}然後就通過keyCode來判斷按下的是哪個鍵。這樣做應該是可以的。

⑤ H5如何對android和ios手機軟鍵盤的監聽

    總結:

    1.在ios中軟鍵盤彈起時,僅會引起body的scrollTop值改變,但是我們可以通過輸入框的獲取焦點情況來做判斷,單也只能在ios中採用這個方案,因為在android中存在主動受氣鍵盤後,但輸入框並沒有失去焦點,而ios中鍵盤受氣後就會失去焦點;

2.在androis中軟鍵盤彈起或收起時,會改變window的高度,因此監聽window的onresize事件;

一、Android

//獲取原窗口的高度

var originalHeight=document.documentElement.clientHeight ||document.body.clientHeight;

window.onresize=function(){

    //鍵盤彈起與隱藏都會引起窗口的高度發生變化

      var resizeHeight=document.documentElement.clientHeight || document.body.clientHeight;

        if(resizeHeight-0<originalHeight-0){

        //當軟鍵盤彈起,在此處操作

        }else{

        //當軟鍵盤收起,在此處操作

        }

}

二、ios

focusin和focusout支持冒泡,對應focus和blur, 使用focusin和focusout的原因是focusin和focusout可以冒泡,focus和blur不會冒泡,這樣就可以使用事件代理,處理多個輸入框存在的情況。

document.body.addEventListener('focusin', () => {

            //軟鍵盤彈出的事件處理

            if(isIphone()){

            }

        })

  document.body.addEventListener('focusout', () => {

      //軟鍵盤收起的事件處理

        if(isIphone()){

        }

  })

特此聲明文章出處: https://blog.csdn.net/u012982629/article/details/81905894

⑥ 如何在Android中判斷軟鍵盤是否彈出或隱藏

android判斷軟鍵盤是否彈出和隱藏,主要是通過InputMethodManager 這個類來監聽,如下代碼:


java">=(InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
privatebooleanhideKeyboard(){if(inputMethodManager.isActive(searchEditText)){
//因為是在fragment下,所以用了getView()獲取view,也可以用findViewById()來獲取父控制項getView().requestFocus();//強制獲取焦點,不然getActivity().getCurrentFocus().getWindowToken()會報錯inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);inputMethodManager.restartInput(searchEditText);returntrue;}returnfalse;}

⑦ android 檢測是否有鍵盤

Android 檢測是否有鍵盤,主要根據根View的位置是不會變化的,假如發生了變化,那麼就可能是鍵盤彈起了,所以我們通過判斷他的位置變化去判斷鍵盤是否彈起。如下代碼進行檢測:

finalintheigh=getWindowManager().getDefaultDisplay().getHeight()/3;
root.addOnLayoutChangeListener(newView.OnLayoutChangeListener(){
@Override
publicvoidonLayoutChange(Viewv,intleft,inttop,intright,intbottom,intoldLeft,intoldTop,intoldRight,intoldBottom){
//彈起事件
if(bottom!=0&&oldBottom!=0&&oldBottom-bottom>heigh){
if(mListView.getLastVisiblePosition()!=mDateArrays.size()-1){
mListView.smoothScrollToPosition(mDateArrays.size()-1);
}
}
elseif(oldBottom!=0&&bottom!=0&&(bottom-oldBottom>keyHeight)){
Toast.makeText(MainActivity.this,"監聽到軟體盤關閉...",Toast.LENGTH_SHORT).show();}
}
});

⑧ android 中使用setOnKeyListener無法監聽按鍵

如果你用的是android的模擬器的話,有可能有一個問題是:你在調試程序的時候的輸入法是android輸入法,由模擬器上的小鍵盤輸入才會監聽,我遇到這問題,呵呵 如果你已經這樣做了,那……有的時候不一定是代碼問題。

熱點內容
linuxdump 發布:2024-11-23 07:06:05 瀏覽:393
差距的演算法 發布:2024-11-23 06:48:09 瀏覽:884
hmcl離線伺服器怎麼裝皮膚 發布:2024-11-23 06:42:49 瀏覽:230
各型緩存器年額最高多少 發布:2024-11-23 06:42:43 瀏覽:62
光譜特徵編譯 發布:2024-11-23 06:19:46 瀏覽:893
怎樣拍視頻上傳 發布:2024-11-23 06:15:39 瀏覽:904
創建個存儲過程 發布:2024-11-23 06:15:35 瀏覽:378
市場配置資源的主體地位如何理解 發布:2024-11-23 06:13:48 瀏覽:729
單循環編程題 發布:2024-11-23 06:09:04 瀏覽:564
解壓後有個文件看不到 發布:2024-11-23 05:54:01 瀏覽:126