問題
- 能否直接將 `BluetoothDevice` 對象序列化保存到 SharedPreferences/文件?
- 能否將 MAC 地址字符串轉回 `BluetoothDevice`?
答案
- 不可直接保存對象:`BluetoothDevice` 非 `Serializable`/`Parcelable`,且包含底層 Native 句柄,進程重啟後句柄失效。
- 不可由 MAC 字符串直接構造:無公構造函數,需通過 `BluetoothAdapter.getRemoteDevice(macString)` 獲取。
最佳實踐:只存 MAC 地址
// 保存
SharedPreferences sp = getSharedPreferences("bt", MODE_PRIVATE);
sp.edit().putString("device_mac", device.getAddress()).apply();
// 使用時重建
String mac = sp.getString("device_mac", "");
if (!TextUtils.isEmpty(mac)) {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = adapter.getRemoteDevice(mac); // 可能拋 IllegalArgumentException
// 後續連接、配對...
}
注意事項
- `getRemoteDevice` **不發起連接**,僅創建代理對象;若設備不在配對列表,後續 `createBond()` 會發起配對請求。
- MAC 地址格式標準:`XX:XX:XX:XX:XX:XX`(大寫/小寫均可)。
- Android 6.0+ 需 `ACCESS_FINE_LOCATION` 或 `BLUETOOTH_SCAN` 權限才能掃描/獲取遠程設備。