写一个蓝牙spp通讯的app
时间: 2024-02-24 21:00:07 浏览: 109
以下是一个可以使用Java编写的蓝牙SPP通讯的简单Android应用程序示例:
1. 首先,在AndroidManifest.xml文件中添加以下权限:
```xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
```
2. 在MainActivity.java文件中,实现蓝牙初始化、搜索、连接和通讯的逻辑代码:
```java
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class MainActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter;
private BluetoothSocket mBluetoothSocket;
private InputStream mInputStream;
private OutputStream mOutputStream;
private ListView mMessageListView;
private EditText mMessageEditText;
private Button mSendButton;
private List<String> mMessageList = new ArrayList<>();
private MessageListAdapter mMessageListAdapter;
private static final int MESSAGE_READ = 1;
private static final int MESSAGE_WRITE = 2;
private static final int MESSAGE_TOAST = 3;
private static final String TOAST = "toast";
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MESSAGE_READ:
byte[] buffer = (byte[]) msg.obj;
String message = new String(buffer, 0, msg.arg1);
appendMessage("收到消息:" + message);
break;
case MESSAGE_WRITE:
byte[] buffer2 = (byte[]) msg.obj;
String message2 = new String(buffer2);
appendMessage("发送消息:" + message2);
break;
case MESSAGE_TOAST:
String message3 = msg.getData().getString(TOAST);
Toast.makeText(getApplicationContext(), message3, Toast.LENGTH_SHORT).show();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
finish();
return;
}
mMessageListView = (ListView) findViewById(R.id.message_list);
mMessageEditText = (EditText) findViewById(R.id.message_edit);
mSendButton = (Button) findViewById(R.id.send_button);
mMessageListAdapter = new MessageListAdapter(this, mMessageList);
mMessageListView.setAdapter(mMessageListAdapter);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String message = mMessageEditText.getText().toString();
sendMessage(message);
}
});
}
@Override
protected void onStart() {
super.onStart();
if (!mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.enable();
}
}
@Override
protected void onResume() {
super.onResume();
if (mBluetoothSocket == null || !mBluetoothSocket.isConnected()) {
connectDevice();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
closeSocket();
}
private void connectDevice() {
if (mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.cancelDiscovery();
}
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice("设备地址");
try {
mBluetoothSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
mBluetoothSocket.connect();
mInputStream = mBluetoothSocket.getInputStream();
mOutputStream = mBluetoothSocket.getOutputStream();
startReading();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "连接失败", Toast.LENGTH_SHORT).show();
}
}
private void startReading() {
new Thread(new Runnable() {
@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = mInputStream.read(buffer);
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
}).start();
}
private void sendMessage(String message) {
if (mOutputStream == null) {
Toast.makeText(this, "未连接设备", Toast.LENGTH_SHORT).show();
return;
}
try {
mOutputStream.write(message.getBytes());
mHandler.obtainMessage(MESSAGE_WRITE, -1, -1, message.getBytes()).sendToTarget();
} catch (IOException e) {
e.printStackTrace();
mHandler.obtainMessage(MESSAGE_TOAST, -1, -1, "发送失败").sendToTarget();
}
}
private void closeSocket() {
try {
if (mBluetoothSocket != null) {
mBluetoothSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void appendMessage(String message) {
mMessageList.add(message);
mMessageListAdapter.notifyDataSetChanged();
mMessageListView.smoothScrollToPosition(mMessageListAdapter.getCount() - 1);
}
}
```
在该示例中,使用BluetoothAdapter获取蓝牙适配器,并创建一个BluetoothSocket对象来连接远程设备。连接成功后,使用InputStream读取数据,使用OutputStream发送数据。在MainActivity中,使用ListView和MessageListAdapter显示消息列表,并使用EditText和Button发送消息。使用Handler处理消息,以便在UI线程中更新UI。
阅读全文