我可以将数据从手机发送到 arduino 并在手机中获得响应,但只是在同一个活动中,出于实际原因,我需要在另一个活动中显示手机中收到的数据,所以我尝试通过使用 put extras 选项接收数据,但我收到错误并且应用程序崩溃,因为数据正在其他线程中接收,我认为如果在启动第二个活动之前接收到的数据不完整,这可能会导致问题,有什么建议吗?
1 回答
好的,我很久以前就这样做了,我不记得我在蓝牙示例中做了什么更改,所以只需按照这些步骤操作,您就可以发送和接收来自任何类的字符串。
如果您在 android sdk 示例中使用蓝牙聊天示例,请执行以下操作:
- 在 bluetoothchat 类中:*将“private”BluetoothChatService mChatService 更改为“public”。然后在您要发送字符串的活动中执行此操作
BluetoothChat.mChatService.write(byteArray);
其中 byteArray 听起来是一个字节数组,因此您需要一个字符串到字节数组转换器以使事情变得简单:
public static byte[] convertStringToByteArray(String s)
{
byte[] byteArray = null;
if(s!=null)
{
if(s.length()>0)
{
try
{
byteArray = s.getBytes();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
return byteArray;
}
那是发送和接收:
我所做的是为进入和退出特定类创建一个布尔值,例如,当我进入一个类时,我会将这个布尔值设为真,并将我在 Bluetoothchat 类中收到的字符串转发给我想要的类,例如你会去在这些代码行的蓝牙聊天类:
case MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
// construct a string from the valid bytes in the buffer
String readMessage = new String(readBuf, 0, msg.arg1);
mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage);
其中 readMessage 是您收到的字符串消息,但您会将其设置为“readMessage”一个公共静态变量.....所以您会说如果我处于活动状态,例如第一个,然后将静态布尔值设置为 true 并且例如,您将创建一个名为 update 的函数,该函数检查布尔值是否为真,然后获取 readMessage 字符串并对其执行任何操作,例如设置文本:
if(Bluetoothchat.one==true)
tv.settext(Bluetoothchat.readMessage);
那么您需要在退出当前活动时将此布尔值更改为 false,这样应用程序就不会崩溃,因此您可以执行以下操作:
@Override
public void onBackPressed() {
BluetoothChatone.one=false;
super.onBackPressed();
}
如果您遇到错误,请告诉我,这样我就可以看到我错过了要告诉您的内容。