我查看了开发者网站并获得了一些开发蓝牙聊天应用程序的帮助。我无法连接到其他设备。我使用了开发者网站蓝牙聊天示例中提到的UUID。我知道它应该是独一无二的,但我不知道如何找到。请告诉我。我正在使用三星Galaxy J7。
答案 0 :(得分:0)
蓝牙聊天示例有助于如何根据sample。
执行类似的应用此应用程序允许两个Android设备通过蓝牙进行双向文本聊天。它演示了所有基本的蓝牙API功能,例如:(1)扫描其他蓝牙设备(2)查询配对蓝牙设备的本地蓝牙适配器(3)建立RFCOMM通道/插座(4)连接到远程设备(5) )通过蓝牙传输数据
样本不容易学习,我需要一些帮助。
蓝牙连接在客户端和服务器方法中工作,即使您连接2个设备,所有设备都将是客户端和服务器(设备连接到其他设备并且也接受来自其他设备的连接)。
UUID代表通用唯一标识符,您的UUID必须是唯一的,但是,唯一性并不总是有保证,并且生成相同UUID的机会很低,您不必担心唯一性。如果你愿意,谷歌" UUID generator"并且您会找到this等网站。
生成UUID后,请为客户端和服务器使用相同的UUID。
要连接到其他设备,您必须首先枚举配对设备,BluetoothAdapter
包含初始设置的所有内容。 android.bluetooth.*
包中包含您应用的所有内容。
BluetoothAdapter
是一个Singleton,因此您可以多次调用方法BluetoothAdapter.getDefaultAdapter()
而不会产生太多实例。
BluetoothAdapter.getDefaultAdapter()
我们将mBluetoothAdapter
指定为BluetoothAdapter.getDefaultAdapter()
。
确保蓝牙已开启,如果蓝牙已关闭,请开启。
if (!mBluetoothAdapter.isEnabled()) mBluetoothAdapter.enable();
打开蓝牙需要几秒钟。
让我们列举配对设备,BluetoothDevice
包含有关特定设备的信息,"已绑定"意味着"配对"。
List<BluetoothDevice> devices = new ArrayList<>();
for (BluetoothDevice device : mBluetoothAdapter.getBondedDevices()) {
devices.add(device);
}
//Let's add the bonded devices to an ListView
MyBluetoothAdapter adapter = new MyBluetoothAdapter(this, devices);
mListView.setAdapter(adapter);
MyBluetoothAdapter
就是一个例子,您需要制作自己的ArrayAdapter
以满足您的需求。
当选择某个项目时,蓝牙将连接到设备,以防止UI冻结,将使用不同的线程在后台进行连接。
BluetoothDevice device = yourMethodToGetTheDevice();
ConnectThread mConnectThread = new ConnectThread(device);
mConnectThread.start();
ConnectThread代码在这里(我建议创建一个内部类来访问父类方法):
示例使用的蓝牙协议是RFCOMM。 mUUID
是使用上述网站生成的UUID。
private class ConnectThread extends Thread {
public ConnectThread(BluetoothDevice device) {
try {
mBluetoothSocket = device.createRfcommSocketToServiceRecord(mUUID);
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
}
@Override
public void run() {
try {
Log.i(TAG, "Connecting...");
mBluetoothSocket.connect();
new ConnectedThread(mBluetoothSocket);
Log.i(TAG, "Connected");
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
}
}
建立连接后,您就可以发送数据了。
接受他人&#39;连接,你必须启动一个持续检查连接的后台线程。
private class AcceptThread extends Thread implements Closeable {
private BluetoothServerSocket mBluetoothServerSocket;
private volatile boolean running = true;
public AcceptThread(String name) {
mBluetoothServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(name, mUUID);
}
@Override
public void run() {
while (running) {
try {
mBluetoothSocket = mBluetoothServerSocket.accept();
if (mBluetoothSocket != null) {
close();
new ConnectedThread(mBluetoothSocket);
}
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
break;
}
}
}
@Override
public void close() throws IOException {
mBluetoothServerSocket.close();
mBluetoothServerSocket = null;
running = false;
}
}
此代码限制与单个设备的连接。
设备连接后,ConnectedThread
将启动。
private class ConnectedThread extends Thread implements Closeable {
private InputStream in;
private OutputStream out;
private volatile running = true;
public ConnectedThread(BluetoothSocket socket) {
try {
in = socket.getInputStream();
out = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
}
@Override
public void run() {
//The maximum amount of data to receive is 4KB, if you want to receive more data, you'll have to receive large data by chunks using while loop.
//Usually text isn't as large as 4KB.
byte[] data = new byte[4096];
int length;
while (running) {
try {
length = in.read(data);
String text = new String(data, 0, length);
Log.i(TAG, text);
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
//Connection was lost
break;
}
}
}
public void write(byte[] data) throws IOException {
out.write(data);
}
}
要发送数据,例如文本,请使用以下代码:
mConnectedThread.write("MY TEXT".getBytes());
要接收数据,请使用ConnectedThread
中的代码并处理String text
变量。