Android不会在第一个按钮上发送数据

时间:2013-08-28 18:25:16

标签: android bluetooth

我试图通过蓝牙将数据发送到另一台支持蓝牙的设备。这是使用SPP配置文件,我的应用程序围绕SDK附带的BluetoothChat示例代码。

我更改了代码,以便按下按钮时,应用程序会自动开始通过蓝牙发送数据。还有一个停止按钮来停止发送数据。

问题是,当您第一次打开应用程序并按下开始按钮时,它不会发送任何数据。如果再次按下开始按钮,它将正常工作并发送数据。现在没有问题,所有按钮和发送数据都能正常工作。

但是,为什么第一次按下启动按钮失败?这是相关的代码。

按钮监听器

 mConversationView.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            //Toast.makeText(BluetoothChat.this, "" + position, Toast.LENGTH_SHORT).show();
            Intent serverIntent = null;
             switch (position) {
                case 2: //Connect button
                    serverIntent = new Intent(BluetoothChat.this, DeviceListActivity.class);
                    startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_SECURE);
                    break;
                case 0: //Start button
                    sends = 1;
                    mSensorManager.registerListener(BluetoothChat.this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
                    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                    break;
                case 1: //Stop button
                    sendMessage("F0.0\r\n");
                    sendMessage("G0.0\r\n");
                    sends = 0;
                    mSensorManager.unregisterListener(BluetoothChat.this);
                    break;
             };
        }
    });

OnSensorChanged事件

@Override
public void onSensorChanged(SensorEvent event) {
    //Toast.makeText(this, "acce", Toast.LENGTH_SHORT).show();
    if ((event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) || (sends==0))
        return;
    float mSensorX = 0;
    float mSensorY = 0;

    switch (mDisplay.getRotation()) {
    case Surface.ROTATION_0:
        mSensorX = event.values[1];
        mSensorY = -event.values[0];
        break;
    case Surface.ROTATION_90:
        mSensorX = -event.values[0];
        mSensorY = -event.values[1];
        break;
    case Surface.ROTATION_180:
        mSensorX = -event.values[1];
        mSensorY = event.values[0];
        break;
    case Surface.ROTATION_270:
        mSensorX = event.values[0];
        mSensorY = event.values[1];
        break;
}
    //if(mSensorX < 0)
        //mSensorX = mSensorX*-1;
    mSensorX = mSensorX * 3;
    float sendL;
    float sendR;
    mSensorY = mSensorY * (float)0.75;
    if(mSensorX < 1 && mSensorX > -3){
        mSensorX = 0;
    }
    if(mSensorY < 0){   //tilting right
        mSensorY = mSensorY*-1;
        if(mSensorX > -3){
            sendL = mSensorX + mSensorY;
            sendR = mSensorX - mSensorY;
        }
        else{
            sendL = mSensorX - mSensorY;
            sendR = mSensorX + mSensorY;
        }
    }
    else{               //tilting left
        if(mSensorX > -3){
            sendL = mSensorX - mSensorY;
            sendR = mSensorX + mSensorY;
        }
        else{
            sendL = mSensorX + mSensorY;
            sendR = mSensorX - mSensorY;
        }
    }
    String lll = "F";
    String rrr = "G";
    if(sendL < 0){
        lll = "V";
        sendL *= -1;
    }
    if(sendR < 0){
        rrr = "B";
        sendR *= -1;
    }

    String message = Float.toString(sendL);
    message = lll+message + "\r\n";
    sendMessage(message);
    message = Float.toString(sendR);
    message = rrr+message + "\r\n";
    sendMessage(message);

    //float mSensorY = event.values[1];
}

当您按下开始按钮时,它会设置一个标志并启动监听器。停止按钮清除标志并停止监听器。但我似乎无法弄清楚它为什么不能在第一个按钮上工作。谢谢!

1 个答案:

答案 0 :(得分:0)

我在按钮监听器中发现了问题:

case 0: //Start button
    sends = 1;
    mSensorManager.registerListener(BluetoothChat.this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    break;

仅在第一次点击后才起作用,因为第一次点击时没有初始化mAcceleromter。为了解决这个问题,我只是交换了这两行。

case 0: //Start button
    sends = 1;
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mSensorManager.registerListener(BluetoothChat.this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
    break;

现在它可以按下第一个按钮。