2017-01-25 62 views
6

Próbuję utworzyć wtyczkę cordova, która będzie "słuchać" każdego zdarzenia onKeyUp i przekaże keyCode do funkcji wywołania zwrotnego.Cordova Plugin do przekazywania kodu klucza zdarzenia keyUp do aplikacji

Celem jest wykryć żadnego klawisza, który pochodzi z zewnętrznej klawiatury/skaner kodów kreskowych - dowolny znak (np 0,1,2,3 ... a, b, c, ...)

My problemem jest: jak dodać detektor onKeyUp?

Oto co mam do tej pory:

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); 
} 

Więc nie jestem, gdzie umieścić onKeyUp. O ile mi wiadomo - powinien być częścią głównego działania ...?

Odpowiedz

0

Mam taki sam problem z tobą. Pracuję nad projektem PDA. Podążam za Tobą od https://github.com/mircerlancerous/cordova-plugin-keyboard/ tutaj, haha. I to samo pytanie Cordova Plugin - Keyboard Events Android. Teraz jest pewne, że nie możemy pobrać zdarzenia kluczowego z onkeydown, onkeyup, OnKeyListener, tylko jeśli kluczowym zdarzeniem jest klucz sprzętowy. Po moim teście możemy pobrać "w górę w lewo, w prawo, wejść w backspace z powrotem menu VolumeButtons", zastępując dispatchkeyevent, ale tylko w działaniu lub po prostu nie wiem jak zastąpić funkcję działania w CordovaPlugin. Istnieje również inna metoda, za pomocą narzędzi OnKeyListener, ale po prostu może chwycić "Menu VolumeButtons" `` `

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; 
    } 
} 

` `` istnieje metoda nie być testowane. DispatchKeyEvent to listen for Spacebar being pressed