Cordova plugin for passing keyUp event key code to application

I am trying to create a cordova plugin that will "listen" to any onKeyUp event and pass the keyCode to the callback function.

The goal is to detect ANY keystroke coming from an external keyboard / barcode scanner - any character (for example, 0,1,2,3 ... a, b, c, ...)

My problem: how to add an onKeyUp listener?

Here is what I still have:

 package il.co.pnc.cordova.keystrokes; 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 android.view.View; import android.view.View.OnKeyListener; import android.view.KeyEvent; public class keystrokes extends CordovaPlugin { private CallbackContext callback = null; @Override public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException { // Defining the callback if ("register".equals(action)) { this.callback = callbackContext; } return true; } } // *** My problem is - I don't know where to put this: @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // Grab the "Key" character String key = ""; if (event != null) { key = String.valueOf((char)event.getUnicodeChar()); } else { key = String.valueOf(Character.toChars(keyCode)[0]); } // Submit it back to the Javascript Callback function /*PluginResult result = new PluginResult(PluginResult.Status.OK, key); result.setKeepCallback(true); this.callback.sendPluginResult(result);*/ // Pass on the event to Android return super.onKeyUp(keyCode, event); } 

So, I have no where to place onKeyUp . As far as I know, this should be part of the core business ...?

+6
source share
1 answer

I have the same problem with you. I am developing a PDA project. I follow you from https://github.com/mircerlancerous/cordova-plugin-keyboard/ here, haha. And this is the same question. Cord plugin - Android keyboard apps . Now I am sure that we cannot capture a key event with onkeydown, onkeyup, OnKeyListener only if the key event is from a hardware key. After my test, we can capture “up left to right back to the backspace back menu VolumeButtons” by overriding the dispatchkeyevent, but only in the activity, or just that I don’t know how to override the activity function in CordovaPlugin. There is also another method that implements OnKeyListener, but you can just grab the "VolumeButtons menu", `` `

 package com.manueldeveloper; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginResult; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnKeyListener; import android.view.WindowManager; import android.widget.Toast; public class VolumeButtonsListener extends CordovaPlugin implements OnKeyListener { private static final String VolumeButtonsListener_LOG= "VolumeButtonsListener"; private CallbackContext volumeCallbackContext; public VolumeButtonsListener(){ volumeCallbackContext= null; } public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); cordova.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE); cordova.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); cordova.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); cordova.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); } }); // Check the action if( action.equals("start") ){ // Check if the plugin is listening the volume button events if( this.volumeCallbackContext != null ){ callbackContext.error("Volume buttons listener already running"); return true; } // Get the reference to the callbacks and start the listening process this.volumeCallbackContext= callbackContext; this.webView.getView().setOnKeyListener(this); // Don't return any result now PluginResult pluginResult= new PluginResult(PluginResult.Status.NO_RESULT); pluginResult.setKeepCallback(true); this.volumeCallbackContext.sendPluginResult(pluginResult); return true; } else if( action.equals("stop") ){ // Erase the callbacks reference and stop the listening process sendSignal(new JSONObject(), false); // release status callback in Javascript side this.volumeCallbackContext= null; this.webView.getView().setOnKeyListener(null); callbackContext.success(); return true; } return false; } public void onDestroy(){ // Stop the listening process this.webView.getView().setOnKeyListener(null); } public void onReset(){ // Stop the listening process this.webView.getView().setOnKeyListener(null); } public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { keyCode = keyEvent.getKeyCode(); JSONObject infoA= new JSONObject(); try{ infoA.put("signal", new String("keyCode:"+keyCode)); sendSignal(infoA, true); return true; } catch(JSONException ex){ Log.e(VolumeButtonsListener_LOG, ex.getMessage()); } // Check if the event is equal to KEY_DOWN if( keyEvent.getAction() == KeyEvent.ACTION_UP ) { // Check what button has been pressed if( keyCode == KeyEvent.KEYCODE_SPACE ){//KEYCODE_VOLUME_UP // Create a new JSONObject with the information and send it JSONObject info= new JSONObject(); try{ info.put("signal", new String("volume-up")); sendSignal(info, true); return true; } catch(JSONException ex){ Log.e(VolumeButtonsListener_LOG, ex.getMessage()); } } else if( keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ){//KEYCODE_VOLUME_DOWN // Create a new JSONObject with the information and send it JSONObject info= new JSONObject(); try{ info.put("signal", new String("volume-down")); sendSignal(info, true); return true; } catch(JSONException ex){ Log.e(VolumeButtonsListener_LOG, ex.getMessage()); } } } return true; } private void sendSignal(JSONObject info, boolean keepCallback) { if( this.volumeCallbackContext != null ){ PluginResult result= new PluginResult(PluginResult.Status.OK, info); result.setKeepCallback(keepCallback); this.volumeCallbackContext.sendPluginResult(result); } } public boolean dispatchKeyEvent(KeyEvent event) { /*if (event.getAction() == KeyEvent.ACTION_UP){ Log.e("activity=","ACTION_UP"+event.getKeyCode()); return true; }*/ //return super.dispatchKeyEvent(event); return true; } } 

`` There is no proven method. DispatchKeyEvent to listen for spacebar clicks

0
source

Source: https://habr.com/ru/post/1014429/


All Articles