???一、環境配置??
1. ??添加依賴??
在?build.gradle
?中添加庫依賴:
dependencies {implementation 'com.github.akexorcist:bluetoothspp:1.0.0'
}
2. ??權限聲明(AndroidManifest.xml)?
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Android 12+ 額外權限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 6.0+ 需要 --> [4,8](@ref)
二、頁面布局(activity_main.xml)
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><!-- 狀態顯示 --><TextViewandroid:id="@+id/tv_status"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="藍牙未連接"android:textSize="18sp"/><!-- 設備列表 --><ListViewandroid:id="@+id/lv_devices"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><!-- 操作按鈕 --><Buttonandroid:id="@+id/btn_scan"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="掃描設備"/><Buttonandroid:id="@+id/btn_send"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="發送數據"android:enabled="false"/> <!-- 默認禁用 --></LinearLayout>
???三、核心代碼(MainActivity.java)?
1. ??初始化藍牙服務?
public class MainActivity extends AppCompatActivity {private BluetoothSPP bt;private TextView tvStatus;private Button btnScan, btnSend;private ListView lvDevices;private List<BluetoothDevice> deviceList = new ArrayList<>();private ArrayAdapter<String> adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvStatus = findViewById(R.id.tv_status);btnScan = findViewById(R.id.btn_scan);btnSend = findViewById(R.id.btn_send);lvDevices = findViewById(R.id.lv_devices);// 初始化設備列表適配器adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);lvDevices.setAdapter(adapter);// 初始化藍牙bt = new BluetoothSPP(this);if (!bt.isBluetoothAvailable()) {Toast.makeText(this, "藍牙不可用", Toast.LENGTH_SHORT).show();finish();}// 設置數據接收監聽器bt.setOnDataReceivedListener((data, message) -> {tvStatus.setText("收到數據: " + message); // [1,6](@ref)});// 設置連接狀態監聽器bt.setBluetoothConnectionListener(new BluetoothSPP.BluetoothConnectionListener() {@Overridepublic void onDeviceConnected(String name, String address) {tvStatus.setText("已連接至 " + name);btnSend.setEnabled(true); // 啟用發送按鈕}@Overridepublic void onDeviceDisconnected() {tvStatus.setText("連接斷開");btnSend.setEnabled(false);}@Overridepublic void onDeviceConnectionFailed() {tvStatus.setText("連接失敗");}});// 啟動藍牙服務bt.setupService();bt.startService(BluetoothState.DEVICE_OTHER); // [1,6](@ref)// 掃描按鈕事件btnScan.setOnClickListener(v -> scanDevices());// 發送按鈕事件btnSend.setOnClickListener(v -> sendData());// 設備列表點擊事件lvDevices.setOnItemClickListener((parent, view, position, id) -> {BluetoothDevice device = deviceList.get(position);connectDevice(device.getAddress()); // 連接選中的設備 [3](@ref)});}// 掃描設備private void scanDevices() {if (!checkPermissions()) {requestPermissions(); // 動態申請權限return;}deviceList.clear();adapter.clear();bt.setDeviceTarget(BluetoothState.DEVICE_OTHER);bt.startDiscovery(); // 開始掃描 [6](@ref)// 注冊廣播接收器IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);registerReceiver(discoveryReceiver, filter);}// 廣播接收器(處理設備發現)private final BroadcastReceiver discoveryReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothDevice.ACTION_FOUND.equals(action)) {BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);deviceList.add(device);adapter.add(device.getName() + "\n" + device.getAddress()); // 顯示設備名和地址 [8](@ref)}}};// 連接設備(帶延遲避免沖突)private void connectDevice(String address) {new Handler().postDelayed(() -> {bt.connect(address); // 延遲500ms連接 [3](@ref)}, 500);}// 發送數據private void sendData() {bt.send("Hello Device!", true); // 發送字符串(自動添加CR/LF)[1](@ref)}// 權限檢查(兼容Android 12+)private boolean checkPermissions() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {return checkSelfPermission(BLUETOOTH_SCAN) == PERMISSION_GRANTED && checkSelfPermission(BLUETOOTH_CONNECT) == PERMISSION_GRANTED;} else {return checkSelfPermission(ACCESS_FINE_LOCATION) == PERMISSION_GRANTED;}}// 動態請求權限private void requestPermissions() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {requestPermissions(new String[]{Manifest.permission.BLUETOOTH_SCAN,Manifest.permission.BLUETOOTH_CONNECT,Manifest.permission.ACCESS_FINE_LOCATION}, 1);} else {requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);}}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(discoveryReceiver); // 注銷廣播bt.stopService(); // 釋放資源 [6](@ref)}
}