在Android WebView中读取键盘事件

在Android WebView中读取键盘事件,android,webview,android-webview,android-softkeyboard,keyevent,Android,Webview,Android Webview,Android Softkeyboard,Keyevent,我正在尝试在android web view中收听关键事件。例如,当用户填写表单时,我应该收到关键事件。这是我的WebView代码 public class MyWebView extends WebView implements OnKeyListener { ..... @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.i("PcWebView", "o

我正在尝试在android web view中收听关键事件。例如,当用户填写表单时,我应该收到关键事件。这是我的WebView代码

public class MyWebView extends WebView implements OnKeyListener
{
    .....

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        Log.i("PcWebView", "onKeyDown keyCode=" + keyCode);
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event)
    {
        Log.i("PcWebView", "onKeyUp keyCode=" + keyCode);
        return super.onKeyUp(keyCode, event);
    }

    @Override // Listener is initialized in the constructor
    public boolean onKey(View v, int keyCode, KeyEvent event)
    {
        Log.i("PcWebView", "onKey keyCode=" + keyCode);
        return false;
    }

    .....

}

当用户在文本框或文本区域中键入内容时,不会调用
onKeyDown
onkeydup
onKey
方法。是否有可能实现这一点,或者Android限制了这一点,因为可能会侵犯隐私?

我不知道您是否已经尝试过这一点,但是……或者,您可以为“MyWebViewClass”启用javascript,并使用javascript事件调用java代码,使用


完整故事:-

小心!此解决方案仅支持英文字母。

无需访问HTML源代码或JS事件即可完成。适用于我在安卓5.0.2上的软键盘和硬件键盘

public class MyWebView extends WebView {


    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new BaseInputConnection(this, false); //this is needed for #dispatchKeyEvent() to be notified.
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        boolean dispatchFirst = super.dispatchKeyEvent(event);
        // Listening here for whatever key events you need
        if (event.getAction() == KeyEvent.ACTION_UP)
            switch (event.getKeyCode()) {
                case KeyEvent.KEYCODE_SPACE:
                case KeyEvent.KEYCODE_ENTER:
                    // e.g. get space and enter events here
                    break;
            }
        return dispatchFirst;
    }
}

这里的诀窍是用简化的输入实现覆盖系统提供的
InputConnection
。谷歌故意阻止开发人员默认访问事件。因为键事件输入不再是唯一的输入。这里有手势,声音,还有更多的东西。官方建议“完全停止依赖遗留的关键事件来输入文本”。查看此处的更多详细信息:

您可以在WebViewClient类上使用onUnhandledKeyEvent()函数重写。 对我来说很合适


您可以像这样使用javascript


box.addEventListener('keydown',e=>{
如果(如keyCode===13){
警报('按下回车键')
}
})

我在Kotlin中找到了一种简单的方法,可以通过JavaScript回调实现这一点

    webview.apply {
        settings.javaScriptEnabled = true

        addJavascriptInterface(object {
            @JavascriptInterface
            fun keyInteraction(): Boolean {
                //<handle key interaction here>
                return true
            }
        },"Android")

        webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                loadingFinished()
                view?.loadUrl(
                    "javascript:(function() {" +
                    "    window.parent.addEventListener (" +
                    "        'keyup'," +
                    "        function(event) {" +
                    "            Android.keyInteraction();" +
                    "        });" +
                    "})()"
                )
                super.onPageFinished(view, url)
            }
        }
    }
webview.apply{
settings.javaScriptEnabled=true
addJavascriptInterface(对象{
@JavascriptInterface
fun keyInteraction():布尔值{
//
返回真值
}
}“安卓系统”)
webViewClient=对象:webViewClient(){
覆盖乐趣onPageFinished(视图:WebView?,url:字符串?){
加载完成()
查看?.loadUrl(
“javascript:(函数(){”+
“window.parent.addEventListener(”+
“‘键控’,”+
“函数(事件){”+
“Android.keyInteraction();”+
"        });" +
"})()"
)
super.onPageFinished(视图、url)
}
}
}

您能让它工作吗?我现在有完全相同的问题…不,这种类型的操作被认为是不安全的,因为可以记录密码等。所以在android中是不允许的。@PC。是的,当然可以。例如,如果加载到WebView中的页面类似于,则在文本框中输入的每个字母都会通知您。这可能会导致问题。由于忽略了
EditorInfo
(其中包含
InputType
信息),因此可能会导致显示错误的键盘。上次使用的键盘是数字键盘,但用户点击文本字段,数字键盘就会出现(有趣的是,这只发生在某些设备上,如HTC One M8)。我试图在Enter键上隐藏键盘,我必须以另一种方式实现这一点-我在URL即将加载时隐藏了键盘(
webViewClient.shouldOverrideUrlLoading()
)。我需要知道是否有任何虚拟键盘事件到达我的WebView中的文本字段中,用于非活动计时器,这非常有效。谢谢。注意:调用需要API级别28。不,这在Android 11上不起作用
    webview.apply {
        settings.javaScriptEnabled = true

        addJavascriptInterface(object {
            @JavascriptInterface
            fun keyInteraction(): Boolean {
                //<handle key interaction here>
                return true
            }
        },"Android")

        webViewClient = object : WebViewClient() {
            override fun onPageFinished(view: WebView?, url: String?) {
                loadingFinished()
                view?.loadUrl(
                    "javascript:(function() {" +
                    "    window.parent.addEventListener (" +
                    "        'keyup'," +
                    "        function(event) {" +
                    "            Android.keyInteraction();" +
                    "        });" +
                    "})()"
                )
                super.onPageFinished(view, url)
            }
        }
    }