Javascript Cordova插件-键盘事件Android

Javascript Cordova插件-键盘事件Android,javascript,java,android,cordova,Javascript,Java,Android,Cordova,我正在努力为Android上的Cordova创建一个插件,该插件可以拦截硬件键盘事件,并将它们提供给Javascript侦听器。我以前也创建过其他插件,但我正在努力解决这个问题,因为我一开始对Java不是特别在行。下面代码段中的所有内容都可以编译,但Javascript端没有任何内容。在此感谢您的帮助 更新: 经过更多的研究,在Android的更高版本中,默认情况下关键事件被禁用。这是因为有一些借口说,使用如此多不同的输入设备和方法可以获得更好的用户体验。如果你是从头开始构建应用程序,这篇文章似

我正在努力为Android上的Cordova创建一个插件,该插件可以拦截硬件键盘事件,并将它们提供给Javascript侦听器。我以前也创建过其他插件,但我正在努力解决这个问题,因为我一开始对Java不是特别在行。下面代码段中的所有内容都可以编译,但Javascript端没有任何内容。在此感谢您的帮助

更新: 经过更多的研究,在Android的更高版本中,默认情况下关键事件被禁用。这是因为有一些借口说,使用如此多不同的输入设备和方法可以获得更好的用户体验。如果你是从头开始构建应用程序,这篇文章似乎提供了解决方案,但不是针对Cordova。有一些东西,可以为科尔多瓦工作,但它似乎入侵一个插件。我想覆盖CordovaWebView中的一些方法,但我不想重新初始化它。这是Javascript中的常见做法;有人知道如何在Java for Android中实现这一点吗

KeyboardPlugin.java

package com.otb.cordova.keyboard;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import org.apache.cordova.PluginResult;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.KeyEvent;
import android.view.*;

public class KeyboardPlugin extends CordovaPlugin implements OnKeyListener{
    private CallbackContext keyup_callback = null;
    private CallbackContext keydown_callback = null;

    @Override
    public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {

        if (action.equalsIgnoreCase("keyUp")) {
            keyup_callback = callbackContext;
        }
        else if(action.equalsIgnoreCase("stopKeyUp")){
            keyup_callback = null;
        }
        else if(action.equalsIgnoreCase("keyDown")){
            keydown_callback = callbackContext;
        }
        else if(action.equalsIgnoreCase("stopKeyDown")){
            keydown_callback = null;
        }
        else {
            // invalid action
            return false;
        }

        PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
        result.setKeepCallback(true);
        callbackContext.sendPluginResult(result);

        return true;
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP) {
            KeyUp(keyCode, event);
        }
        else if (event.getAction() == KeyEvent.ACTION_DOWN) {
            KeyDown(keyCode, event);
        }
        return false;
    }

    private boolean KeyDown(int keyCode, KeyEvent event){
        if(keydown_callback == null){
            return true;
        }
        PluginResult result = new PluginResult(PluginResult.Status.OK, Integer.toString(keyCode));
        result.setKeepCallback(true);
        keydown_callback.sendPluginResult(result);
        return false;
    }

    private boolean KeyUp(int keyCode, KeyEvent event){
        if(keyup_callback == null){
            return true;
        }
        PluginResult result = new PluginResult(PluginResult.Status.OK, Integer.toString(keyCode));
        result.setKeepCallback(true);
        keyup_callback.sendPluginResult(result);
        return false;
    }
}
plugin.js

    Plugin.keyboardPlugin = {
  onKeyUp: function(callback, onFail){
    cordova.exec(callback, onFail, 'KeyboardPlugin', 'keyUp', []);
  },

  onKeyDown: function(callback, onFail){
    cordova.exec(callback, onFail, 'KeyboardPlugin', 'keyDown', []);
  },

  stopKeyUp: function(callback, onFail){
    cordova.exec(callback, onFail, 'KeyboardPlugin', 'stopKeyUp', []);
  },

  stopKeyDown: function(callback, onFail){
    cordova.exec(callback, onFail, 'KeyboardPlugin', 'stopKeyDown', []);
  }
};
plugin.xml

    <?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        xmlns:android="http://schemas.android.com/apk/res/android"
        id="cordova-plugin-keyboard"
        version="0.0.1">
    <name>Keyboard Plugin</name>
    <description>This is a project to read key strokes from Cordova on Android.</description>
    <license>Apache 2.0</license>
    <keywords>cordova,plugin,keyboard</keywords>
    <repo>https://github.com/mircerlancerous/cordova-plugin-keyboard</repo>
    <issue>https://github.com/mircerlancerous/cordova-plugin-keyboard/issues</issue>

    <engines>
        <engine name="cordova-android" version=">=3.6.0" /><!-- Requires CordovaPlugin.preferences -->
    </engines>


    <js-module src="www/plugin.js" name="keyboardPlugin">
        <runs/>
    </js-module>

    <platform name="android">
        <config-file target="res/xml/config.xml" parent="/*">
            <feature name="KeyboardPlugin" >
                <param name="android-package" value="com.otb.cordova.keyboard.KeyboardPlugin"/>
                <param name="onload" value="true" />
            </feature>
        </config-file>

        <source-file src="src/android/KeyboardPlugin.java" target-dir="src/com/otb/cordova/keyboard"/>
    </platform>

</plugin>

键盘插件
这是一个在Android上读取Cordova按键的项目。
Apache2.0
cordova、插件、键盘
https://github.com/mircerlancerous/cordova-plugin-keyboard
https://github.com/mircerlancerous/cordova-plugin-keyboard/issues
这是指向github存储库的链接。