我构建了一个控制RC汽车的Android应用程序。这个应用程序有两个活动,蓝牙活动和方向活动。
在蓝牙活动中,我使用列表视图列出所有设备并连接一个。我使用了Android "ConnectThread" and "ConnectedThread"提供的两个类。我的主要工作是只将角色送到遥控车上移动。此角色由方向活动生成,该活动使用加速度传感器生成角色。
问题:
1.如何将方向活动中的角色发送到蓝牙活动?
2.蓝牙活动收到角色后如何通过蓝牙连接发送?
3.我需要两个班级" ConnectThread"和" ConnectedThread"连接和发送或只发送其中一个?
PS。我是初学者,我尝试过很多东西,比如intent,共享Preference和Bundle。但每次我尝试发生错误。
答案 0 :(得分:1)
好的,让我们暂时让它变得简单。
正如@Zimano所说:
两种解决方案。一个简单但不可推荐,一个有点复杂但是Android SDK和策略的一部分。
在第一种情况下,将与Activity之外的蓝牙相关的所有代码移到另一个类中。将它放在静态上下文中,以便它可以在应用程序的任何地方使用(这就是为什么它是一个非常差的设计模式,但是一个工作的...)。然后你可以在任何地方访问你的蓝牙线程,你可以使用write方法发送数据;
在第二种情况下,将相同的代码移动到服务中。服务是Android SDK的一部分,是您想要实现的目标。但是有一个活动绑定。根据我的经验,我没有处理很多服务,因此我不确定您是否可以随意绑定/取消绑定Android服务,而不会在活动之间切换时停止蓝牙线程。更多详情:http://developer.android.com/intl/es/guide/components/services.html
无论如何,我希望我提供了足够的解释,以便您可以处理您的问题。如果您有任何疑问,我会尽力回答。
答案 1 :(得分:0)
@Mackovich非常感谢你以及其他试图提供帮助的人。为了遇到同样问题的其他人。这是我搜索很长时间后的解决方案。
P.S我想提一件事,我读到"服务"这是正确的方式。但我以其他简单的方式做到了。
我有两项活动(1)蓝牙搜索活动,以及(2)方向活动。
我的问题是我尝试在活动(1)中执行所有蓝牙stuuf,只需将命令从活动(2)发送到(1),然后将命令发送到RC Car。这是问题,因为@Mackovich说活动可能被破坏。
我要解决的是什么?
在活动(1)中,我使用ListView显示蓝牙设备广播并获取这些设备信息。然后使用 Intent 将这些信息传递给活动(2)。已经连接并尝试发送活动(1)。
注意:要建立蓝牙连接,您需要两个重要信息:
1。 UUID(我们有的)。
2。目标蓝牙设备的MAC地址。 (我们从中获得活动(1))。
因此,首先我们需要蓝牙适配器,阵列适配器(以获取所找设备的信息)和广播接收器。
//Declare Bluetooth Stuff
BluetoothAdapter mBluetoothAdapter; // Make instance of the Bluetooth
ArrayAdapter mArrayAdapter; // Array where the devices will be stored
private static final int ENABLE_BT_REQUEST_CODE = 1;
private static final int DISCOVERABLE_BT_REQUEST_CODE = 2;
private static final int DISCOVERABLE_DURATION = 300;
public static String EXTRA_ADDRESS = "Device_MAC_Address";
//In order for the bluetooth to discover the devices that broadcasting and obtain their info.
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// Whenever a remote Bluetooth device is found
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice mBluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(mBluetoothDevice.getName() + "\n" + mBluetoothDevice.getAddress());
} else {
Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show();
}
}
};
然后,用户选择列出的其中一个设备。我们将获取设备MAC地址并将其发送到活动(2)以进行连接和发送。
//Obtain the value of the item clicked as String value
String itemValue = (String) DevicesList.getItemAtPosition(position);
//Extract the MAC Address from the String value above
String MAC = itemValue.substring(itemValue.length() - 17);
// Make an intent to start next activity.
Intent i = new Intent(BluetoothActivity.this, NavigationActivity.class);
//Change the activity.
i.putExtra(EXTRA_ADDRESS, MAC); //this will be received at NavigationActivity(class) Activity
startActivity(i);
}
});
现在,我们解决了在活动之间传递数据的问题。因为不需要敌人传递数据。
这是原始帖子中的问题(1)。
关于问题(2)。
问题是如果您使用了Google提供的代码。有些事情你需要调整。在类ConnectThread
insaid run
方法中,您需要定义您创建的类ConnectedThread
的对象。通过这种方式,您将传递用于连接的BluetoothSocket
变量以发送数据。
这也解决了问题(3)。是的,你需要两个班级。
正如我在原帖中所说,我是初学者。所以,我认为向初学者解释的最好方法是像一个人一样思考。在这种情况下,我实际上是初学者。
我希望这会帮助别人。如果有人发现任何事情是错误的,请等一下。请告诉我纠正它。
谢谢。