如何用SharedPreferences保存Android Spinner选中的蓝牙设备位置
实现Spinner记住上次选择的蓝牙设备
要实现首次选择后再次打开应用自动选中目标设备,核心是持久化保存用户选择的设备唯一标识(优先用MAC地址,设备名称可能重复),再在加载配对设备后自动定位选中。以下是具体实现步骤:
步骤1:添加SharedPreferences工具方法
在你的Activity中添加用于保存和读取设备MAC地址的方法:
// 保存选中的蓝牙设备MAC地址 private void saveSelectedDeviceMac(String mac) { SharedPreferences sp = getSharedPreferences("BluetoothPrefs", MODE_PRIVATE); sp.edit().putString("selected_device_mac", mac).apply(); } // 获取上次保存的设备MAC地址 private String getSavedDeviceMac() { SharedPreferences sp = getSharedPreferences("BluetoothPrefs", MODE_PRIVATE); return sp.getString("selected_device_mac", null); }
步骤2:修改选中事件,保存设备信息
在OnItemSelectedListener的选中回调里,添加保存MAC地址的逻辑:
private final AdapterView.OnItemSelectedListener mPairedDeviceOnItemSelectedListener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { // 保存选中设备的MAC地址 BluetoothDevice selectedDevice = mBluetoothDeviceArray[i]; saveSelectedDeviceMac(selectedDevice.getAddress()); ConnectThread mConnectThread = new ConnectThread(selectedDevice, view); mConnectThread.start(); mBluetoothToolBar.setSubtitle("Connecting"); } @Override public void onNothingSelected(AdapterView<?> adapterView) { Toast.makeText(BluetoothMain.this, "未选择任何设备", Toast.LENGTH_SHORT).show(); } };
步骤3:加载配对设备后自动选中上次选择的设备
修改mGetBluetoothPairedDevice方法,在设置Adapter后读取保存的MAC地址,找到对应设备索引并设置Spinner选中:
public void mGetBluetoothPairedDevice () { Set<BluetoothDevice> mPairedDevice = mBluetoothAdapter.getBondedDevices(); mBluetoothDeviceArray = new BluetoothDevice[mPairedDevice.size()]; String [] strings = new String[mPairedDevice.size()]; int index = 0; String savedMac = getSavedDeviceMac(); int savedIndex = -1; // 记录上次选中设备的索引 if (mPairedDevice.size() > 0) { for (BluetoothDevice device : mPairedDevice) { mBluetoothDeviceArray[index] = device; strings[index] = device.getName(); // 匹配保存的MAC地址,记录对应索引 if (savedMac != null && savedMac.equals(device.getAddress())) { savedIndex = index; } index++; } } else { // 修正原代码未初始化适配器的问题 String mOnDevice = "未找到配对设备"; strings = new String[]{mOnDevice}; mBluetoothDeviceArray = new BluetoothDevice[0]; // 避免后续空指针 } ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, strings); btPairedDevicesSpinner.setAdapter(mArrayAdapter); // 自动选中上次保存的设备 if (savedIndex != -1) { btPairedDevicesSpinner.setSelection(savedIndex); // 可选:自动触发连接逻辑,无需用户再次点击 // mPairedDeviceOnItemSelectedListener.onItemSelected(btPairedDevicesSpinner, null, savedIndex, 0); } }
注意事项
- 优先用MAC地址保存:设备名称可被用户修改,MAC地址是蓝牙设备的唯一标识,避免识别错误。
- 处理设备取消配对的情况:如果保存的MAC地址不在当前配对列表中,Spinner会保持默认选中状态,符合预期。
- 权限要求:确保应用已申请
BLUETOOTH、BLUETOOTH_ADMIN(Android 12及以下)或BLUETOOTH_CONNECT(Android 13+)权限,否则无法获取配对设备列表。
内容的提问来源于stack exchange,提问作者indiebloog
相关产品推荐
相关产品推荐

