2017-01-25 16 views
6

Tôi đang cố tạo plugin cordova sẽ "nghe" mọi sự kiện onKeyUp và sẽ chuyển keyCode sang chức năng gọi lại.Cordova Plugin để chuyển mã khóa của sự kiện keyUp tới ứng dụng

Mục đích là phát hiện bất kỳ tổ hợp phím mà xuất phát từ một bàn phím/mã vạch-máy quét bên ngoài - bất kỳ ký tự (ví dụ 0,1,2,3 ... a, b, c, ...)

My vấn đề là: làm cách nào để thêm người nghe onKeyUp?

Dưới đây là những gì tôi có cho đến nay:

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

Vì vậy, tôi không phải là nơi để đặt các onKeyUp. Theo như tôi biết - nó phải là một phần của hoạt động chính ...?

Trả lời

0

Tôi gặp vấn đề tương tự với bạn. Tôi đang phát triển một dự án PDA.I theo bạn từ https://github.com/mircerlancerous/cordova-plugin-keyboard/ đến đây, haha. Và cùng một câu hỏi này Cordova Plugin - Keyboard Events Android. Bây giờ chắc chắn rằng chúng tôi không thể lấy sự kiện quan trọng với onkeydown, onkeyup, OnKeyListener chỉ khi sự kiện quan trọng từ khóa phần cứng. Sau khi kiểm tra, chúng tôi có thể lấy "lên xuống bên trái bên phải vào menu backspace trở lại VolumeButtons" bằng cách ghi đè dispatchkeyevent nhưng chỉ trong hoạt động, hoặc chỉ là tôi không biết làm thế nào để ghi đè lên một chức năng hoạt động trong CordovaPlugin. Ngoài ra còn một phương pháp mà theo cụ OnKeyListener, nhưng chỉ có thể lấy "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; 
    } 
} 

` `` Có một phương pháp không được kiểm tra. DispatchKeyEvent to listen for Spacebar being pressed

Các vấn đề liên quan