jjzjj

android - 用于将 keyUp 事件的键码传递给应用程序的 Cordova 插件

coder 2023-12-06 原文

我正在尝试创建一个 cordova 插件,它将“监听”任何 onKeyUp 事件,并将 keyCode 传递给回调函数。

目的是检测来自外部键盘/条形码扫描仪的任何击键 - 任何字符(例如 0,1,2,3...a,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。据我所知 - 它应该是主要 Activity 的一部分......?

最佳答案

我和你有同样的问题。 我正在开发一个 PDA 项目。我从 https://github.com/mircerlancerous/cordova-plugin-keyboard/ 关注你到这里,哈哈。 这是同样的问题Cordova Plugin - Keyboard Events Android . 现在可以肯定的是,仅当来自硬件键的按键事件时,我们不能使用onkeydown,onkeyup,OnKeyListener来抓取按键事件。经过我的测试,我们可以通过重写dispatchkeyevent来抓取“up down left right enter backspace back menu VolumeButtons”但只能在 Activity 中,或者只是我不知道如何覆盖 CordovaPlugin 中的 Activity 功能。 还有另一种方法通过实现 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

关于android - 用于将 keyUp 事件的键码传递给应用程序的 Cordova 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862667/

有关android - 用于将 keyUp 事件的键码传递给应用程序的 Cordova 插件的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  4. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  10. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

随机推荐