2017-01-25 17 views
6

onKeyUpイベントを「聴く」コードバスプラグインを作成しようとしており、keyCodeをコールバック関数に渡します。CordovaプラグインでkeyUpイベントのキーコードをアプリケーションに渡す

目的は、外部キーボード/バーコードスキャナから来ANYキーストローク検出で - 任意の文字を(例えば0,1,2,3 ...、B、C、...)

マイ問題は:onKeyUpリスナーを追加するにはどうすればいいですか?ここで

は、私がこれまで持っているものです。

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

のでonKeyUpを配置する場所を、私はしませんよ。私が知る限り、それは主な活動の一部でなければならない...?

答えて

0

私はあなたと同じ問題に直面しています。 私はPDAプロジェクトを開発しています。ここにはhttps://github.com/mircerlancerous/cordova-plugin-keyboard/からあなたに従います。 これと同じ質問Cordova Plugin - Keyboard Events Android。 これで、onkeydown、onkeyup、OnKeyListenerを使用してキーイベントを取得できないことが確認されました。ハードウェアキーのキーイベントの場合にのみ、OnKeyListenerが有効になります。テストが終了したら、dispatchkeyeventでBackspace Back Menu VolumeButtonsを入力しますアクティビティのみ、またはCordovaPluginのアクティビティの関数をオーバーライドする方法がわかりません。 そこ実装することにより、別の方法OnKeyListenerが、ちょうどテストすることがない方法がある "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; 
    } 
} 

` `` をつかむことができます。 DispatchKeyEvent to listen for Spacebar being pressed

関連する問題