Cordova Plugin for Passing keycode of a keyUp event to the App
Asked Answered
S

1

6

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

The purpose is detect ANY keystroke that comes from an external keyboard / barcode-scanner - any character (e.g. 0,1,2,3... a,b,c,...)

My problem is: how do I add the onKeyUp listener?

Here is what I have so far:

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'm not where to place the onKeyUp. As far as I know - it should be part of the main Activity...?

Semiyearly answered 25/1, 2017 at 22:15 Comment(0)
N
0

I face same problem with you. I am developing a PDA project.I follow you from https://github.com/mircerlancerous/cordova-plugin-keyboard/ to here,haha. And this the same question Cordova Plugin - Keyboard Events Android . Now it is certain that we cant grab key-event with onkeydown,onkeyup,OnKeyListener only if the key-event from hardware key.After my test,we can grab "up down left right enter backspace back menu VolumeButtons" by override dispatchkeyevent but only in activity ,or just that I dont know how to override a function of activity in CordovaPlugin. There also another method by implements OnKeyListener,but just can grab " 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 a method not be tested.DispatchKeyEvent to listen for Spacebar being pressed

Node answered 14/2, 2017 at 8:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.