使用 Switch 控件實現藍牙狀態的可視化切換:開啟時顯示「藍牙開啟中」,關閉時顯示「藍牙關閉中」,並自動呼叫系統藍牙 API 完成真實狀態變更。
<Switch
android:id="@+id/open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="藍牙關閉中"
android:textOn="藍牙開啟中" />
textOff/textOn:分別對應關閉/開啟狀態的顯示文字wrap_content 適配不同螢幕密度Switch openSwitch = findViewById(R.id.open);
// 獲取藍牙適配器
final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
openSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// 開啟藍牙(異步操作,實際狀態變更會觸發 ACTION_STATE_CHANGED 廣播)
if (!mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.enable();
}
} else {
// 關閉藍牙
if (mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.disable();
}
}
}
});
<!-- 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_CONNECT" />
BluetoothAdapter.ACTION_STATE_CHANGED 廣播接收器,監聽 STATE_ON/STATE_OFF 實時更新 UI,避免異步操作導致介面與實際狀態不同步。BLUETOOTH_CONNECT,建議封裝 PermissionUtil 統一處理。setEnabled(false) 並提示用戶。MaterialComponents 主題或 SwitchMaterial 獲得更現代的視覺效果。| 現象 | 可能原因 | 解決方法 |
|---|---|---|
| 點擊 Switch 無反應 | 未聲明 BLUETOOTH_ADMIN 權限 | 在 Manifest 中添加對應權限 |
| enable()/disable() 返回 false | 藍牙硬體不存在或被系統策略禁用 | 檢查 getDefaultAdapter() != null 並引導用戶至系統設定 |
| Android 12 崩潰 | 缺少 BLUETOOTH_CONNECT 權限 | 添加權限並執行運行時申請流程 |
本文提供了從佈局定義、邏輯綁定、權限配置到進階優化的完整藍牙開關實現方案。核心在於 Switch 控件的狀態監聽 與 BluetoothAdapter 異步 API 的正確協作,並妥善處理 Android 版本差異帶來的權限變更。將此模式應用於 Wi-Fi、熱點、NFC 等系統開關同理可得。