You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:35:25