我试图通过蓝牙将数据发送到另一台支持蓝牙的设备。这是使用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];
}
当您按下开始按钮时,它会设置一个标志并启动监听器。停止按钮清除标志并停止监听器。但我似乎无法弄清楚它为什么不能在第一个按钮上工作。谢谢!
答案 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;
现在它可以按下第一个按钮。