我正在构建一个应用程序X,这个应用程序需要通过蓝牙连接到具有相同应用程序(X)的其他设备,所以我想列出可用的设备,但我需要列出那些有的设备应用程序X,有没有办法获得那些安装了应用程序X的特定设备?
答案 0 :(得分:1)
简而言之:通过蓝牙连接应用实例需要实现客户端和服务器端,两者都使用相同的服务记录uuid。
在连接之前,您需要执行蓝牙扫描以查找附近的所有BT可用设备。
详情:
执行发现
// get adapter
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// create discovery listener
discoveryReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
allDiscoveredDevices.add(device);
}
};
// and register it
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
return context.registerReceiver(discoveryReceiver, filter);
// start discovert
boolean started = bluetoothAdapter.startDiscovery(); //async call!
if (!started) {
// log error
}
一旦您知道您所在地区的BT设备,请尝试使用您应用的UUID连接:
客户端连接
BluetoothSocket sock = device.createRfcommSocketToServiceRecord(MY_APP_UUID);
try {
sock.connect(context);
// if here: two peers of your app are now connected <--------------------
} catch (Exception e) {
// no peer app found
}
BT服务器逻辑:
服务器循环
BluetoothServerSocket ssocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(name, MY_APP_UUID);
while (serverIsRunning) {
try {
clientSocket = btServerSocket.accept(); // returns a connected socket
} catch (IOException e) {
// log error
}
}
应该明确的是,上面是天真的编码。现实生活中的BT连接要复杂得多。它处理可能依赖于每个对等操作系统版本的边缘条件。它可能要求您访问隐藏的API,例如通过反思。
BTWiz,一个由您自己开发的开源Android BT库,处理大部分复杂性 为您而且还公开了一个异步IO接口,使BT通信变得更加简单。
随意使用它。但即使不是 - 您可能希望浏览其代码并查看其处理方式 与发现有关的常见BT问题&amp;连接。