如果按下Android Studio,如何制作一个通过蓝牙发送数据的按钮?

时间:2018-04-06 13:30:27

标签: java android bluetooth arduino

我需要制作一个应用程序,按下按钮时,会通过蓝牙将字符发送到Arduino,延迟时间为50毫秒。我是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:抱歉我的英语不好。

2 个答案:

答案 0 :(得分:0)

您可以使用Timer。在切换按钮onClick方法中,您可以调用timedDataSender(),在按钮关闭方法中,您可以将shouldCancel boolean变量设置为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);

    }

答案 1 :(得分:0)

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

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

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