Ⅰ android獲取軟鍵盤高度
在 Android 里我們是無法直接獲取軟鍵盤高度的,但是在某些場景下,我們又需要獲取軟鍵盤的高度。我們可以使用 ViewTreeObserver.OnGlobalLayoutListener 來監聽窗口大小的變化,當軟鍵盤彈出時,窗口高度會變小,使用原始窗口高度減去當前窗口高度,就可以得出軟鍵盤的高度了。
一般我們在 Activity 的 onCreate() 方法中開始監聽:
請注意當 Activity 被銷毀的時候,一定要移除監聽,否則就會產生內存泄漏:
通過以上方法可以實時監聽軟鍵盤的高度變化,特別是像有些輸入法例如搜狗,可以隨時切換拼音輸入、手寫輸入,這個時候軟鍵盤的高度都會發生變化。
除此之外,還可以通過該方法判斷軟鍵盤是否彈出。
Ⅱ H5濡備綍瀵筧ndroid鍜宨os鎵嬫満杞閿鐩樼殑鐩戝惉
鎬葷粨錛
1.鍦╥os涓杞閿鐩樺脊璧鋒椂錛屼粎浼氬紩璧穊ody鐨剆crollTop鍊兼敼鍙橈紝浣嗘槸鎴戜滑鍙浠ラ氳繃杈撳叆妗嗙殑鑾峰彇鐒︾偣鎯呭喌鏉ュ仛鍒ゆ柇錛屽崟涔熷彧鑳藉湪ios涓閲囩敤榪欎釜鏂規堬紝鍥犱負鍦╝ndroid涓瀛樺湪涓誨姩鍙楁皵閿鐩樺悗錛屼絾杈撳叆妗嗗苟娌℃湁澶卞幓鐒︾偣錛岃宨os涓閿鐩樺彈姘斿悗灝變細澶卞幓鐒︾偣錛
2.鍦╝ndrois涓杞閿鐩樺脊璧鋒垨鏀惰搗鏃訛紝浼氭敼鍙榳indow鐨勯珮搴︼紝鍥犳ょ洃鍚瑆indow鐨刼nresize浜嬩歡錛
涓銆丄ndroid
//鑾峰彇鍘熺獥鍙g殑楂樺害
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{
//褰撹蔣閿鐩樻敹璧鳳紝鍦ㄦゅ勬搷浣
}
}
浜屻乮os
focusin鍜宖ocusout鏀鎸佸啋娉★紝瀵瑰簲focus鍜宐lur, 浣跨敤focusin鍜宖ocusout鐨勫師鍥犳槸focusin鍜宖ocusout鍙浠ュ啋娉★紝focus鍜宐lur涓嶄細鍐掓場錛岃繖鏍峰氨鍙浠ヤ嬌鐢ㄤ簨浠朵唬鐞嗭紝澶勭悊澶氫釜杈撳叆妗嗗瓨鍦ㄧ殑鎯呭喌銆
document.body.addEventListener('focusin', () => {
//杞閿鐩樺脊鍑虹殑浜嬩歡澶勭悊
if(isIphone()錛墈
}
})
document.body.addEventListener('focusout', () => {
//杞閿鐩樻敹璧風殑浜嬩歡澶勭悊
if(isIphone()錛墈
}
})
鐗規ゅ0鏄庢枃絝犲嚭澶勶細 https://blog.csdn.net/u012982629/article/details/81905894
Ⅲ android怎麼實現後台對按鍵事件的監控
遙控器按鍵事件這個不是在Android源碼的bootable下面ircon.c配置的么。比如:
{ .scancode = 0x0b, .mask = 0xaa0087ee,
.keycode = KEY_UP, .spec = IRCON_KEYCODE_NORMAL | IRCON_KEYCODE_LONGPRESS | IRCON_KEYCODE_MOUSEMD },
遙控器按鍵編號是「 0x0b」,給他的響應是「KEY_UP」,就是方向鍵的下,這個是在源碼里邊配置的。你必須要有遙控器的書名數,知道遙控器每個按鍵的編號,然後對應給他相應的響應才可以。
但是你要操控手機,你的手機必須要能接受遙控器信號,這個也是要硬體支持的,一般的手機貌似都沒有這個。
這個遙控的響應操作是驅動層做的,和應用層沒什麼關系,主要是驅動和硬體的支持。
Ⅳ 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軟鍵盤的隱藏和消失
原理:自定義布局的onSizeChanged()方法,在其中增加一個監聽介面,當軟鍵盤顯示或隱藏使得布局尺寸發生改變,就能捕獲到這個事件。
具體方法如下:
首先,在清單文件Manifest.xml中的對應的Activity標簽內設置
android:windowSoftInputMode=」adjustResize」
作用是當軟鍵盤顯示或隱藏時,該Activity主窗口總是會被調整大小以便留出軟鍵盤的空間。唯有這樣才能保證布局觸發onSizeChanged()方法。
然後,自定義一個布局,具體是RelativeLayout、LinearLayout或是其它的,根據實際情況而定,自定義的目的是在其onSizeChanged()方法中增加一個監聽介面。這里給出一個自定義RelativeLayout布局代碼:
public class CustomRelativeLayout extends RelativeLayout {
private OnSizeChangedListener listener;
public CustomRelativeLayout(Context context) {
super(context);
}
public CustomRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
Log.d(TAG.CUSTOM_VIEW, 「onSizeChanged」);
super.onSizeChanged(w, h, oldw, oldh);
if (listener != null) {
listener.onSizeChanged(w, h, oldw, oldh);
}
}
public void setOnSizeChangedListener(OnSizeChangedListener listener) {
this.listener = listener;
}
/** * Activity主窗口大小改變時的回調介面(本示例中,等價於軟鍵盤顯示隱藏時的回調介面) */
public interface OnSizeChangedListener {
public void onSizeChanged(int w, int h, int oldw, int oldh);
}
}
最後,在程序中使用此介面(xxx.setOnSizeChangedListener(…))即可實現監聽鍵盤隱藏或顯示事件。