【问题标题】:How to make a button that sends data via Bluetooth as long as is being pressed Android Studio?只要按下Android Studio,如何制作一个通过蓝牙发送数据的按钮?
【发布时间】:2018-04-06 13:30:26
【问题描述】:

我需要制作一个应用程序,当按下按钮时,一个字符会通过蓝牙以 50 毫秒的延迟发送到 Arduino。我是 Android 新手,在网上冲浪时发现了这个解决方案:

base_destra.setOnHoverListener(new View.OnHoverListener() {
    @Override
    public boolean onHover(View v, MotionEvent event) {
        while(event.getAction() == MotionEvent.ACTION_DOWN){
            sendData("d");
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if(event.getAction() == MotionEvent.ACTION_UP){
            sendData("10");
        }
        return false;
    }
});

sendData 在哪里:

private void sendData(String data){
    if(OutStream == null){
        return;
    }
    byte[] comando = data.getBytes();
    try {
        OutStream.write(comando);
    }
    catch (IOException e){
        Toast.makeText(getBaseContext(),"Errore: comando non mandato",Toast.LENGTH_SHORT).show();
    }

}

我在 YouTube 上看到了一个教程,但虽然我复制粘贴了显示的代码,但该应用没有发送任何内容。

PS:Arduino和手机连接正确。

PPS:对不起我的英语不好。

【问题讨论】:

    标签: java android bluetooth arduino


    【解决方案1】:

    您可以使用Timer。在toggle button onClick方法中可以调用timedDataSender(),在button off方法中可以将shouldCancelboolean变量设置为true,发送任务就完成了。这是一个示例代码:

    /* A sendTimer is used to periodically send data */
    private Timer sendTimer;
    private Boolean shouldCancel = false;
    private void timedDataSender(){
    
            TimerTask task = new TimerTask() {
                public void run() {
                    runOnUiThread(new Runnable(){
    
                        @Override
                        public void run() {
                            sendData("10");
                        }
                    });
    
    
                    if(shouldCancel)
                        cancel();
    
                }
            };
    
            sendTimer = new Timer("Timer");
            /* TimerTask, startDelay, period */
            sendTimer.scheduleAtFixedRate(task,0,50);
    
        }
    

    【讨论】:

      【解决方案2】:

      永远不会调用 onHover 事件,因为当您按住按钮时,您不会将鼠标悬停在它上面,而是触摸它。例如,悬停是可用于触控笔的事件。

      所以你只需要使用 onTouchListener。 但是eventevent.getAction() 不是按下按钮的“实时”状态。所以你应该检查按钮的当前状态:

      best_destra.isPressed()
      

      为此,best_destra 需要是最终的。你应该在一个新线程中执行它,因为它会过度阻塞 UI 线程。

      最终代码:

      base_destra.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View v, MotionEvent event) {
              new Thread(new Runnable() {
                  @Override
                  public void run() {
                      while(best_destra.isPressed()){
                           sendData("d");
                           try {
                               Thread.sleep(50);
                           } catch (InterruptedException e) {
                               e.printStackTrace();
                           }
                      }
                  }
              }).start();
      
              return false;
          }
      });
      

      来源: Android button hover event

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-25
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        • 2019-02-14
        相关资源
        最近更新 更多