Ⅰ 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(…))即可实现监听键盘隐藏或显示事件。