android - 动态添加发现蓝牙设备到 ListPreference

标签 android bluetooth sharedpreferences listpreference

我有一个具有以下首选项 xml 资源的 PreferenceFragment:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/Preferences">

<PreferenceCategory
 android:title="@string/Bluetooth">

 <CheckBoxPreference
   android:key="pref_bt_enabled"
   android:title="@string/Bt_checkbox"
   android:summary="@string/Bt_checkbox_summary"
   android:defaultValue="false" />

 <ListPreference 
    android:key="pref_bt_devices"
    android:summary="@string/Bt_devices_summary"
    android:title="@string/Bt_devices"
    android:enabled="false" />

</PreferenceCategory>

</PreferenceScreen>

我想做的是: 当我启用 pref_bt_enabled 时,我会打开蓝牙,查找配对设备并发现其他设备并将它们全部添加到 ListPreference。这是我目前使用的代码:

public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {

private static final int REQUEST_ENABLE_BT = 100;

BluetoothAdapter btAdapter;
Set<BluetoothDevice> pairedDevices;
Set<BluetoothDevice> discoveredDevices;
ListPreference btDevicesList;
ArrayList<CharSequence> entries;
ArrayList<CharSequence> entryValues;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    btDevicesList = (ListPreference) findPreference("pref_bt_devices");

    btAdapter = getBtAdapter();
    if (btAdapter != null) {
        findPreference("pref_bt_enabled").setEnabled(true);
    }

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    getActivity().registerReceiver(btDiscoveryReceiver, filter);
}

@Override
public void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}

@Override
public void onDestroy() {
    super.onPause();
    getActivity().unregisterReceiver(btDiscoveryReceiver);
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (key.equals("pref_bt_enabled")) {
        if (sharedPreferences.getBoolean(key, false) == true) {
            enableBluetooth();
            findPairedDevices();
            discoverDevices();
            btDevicesList.setEnabled(true);
        }
        else {
            btAdapter.disable();
            btDevicesList.setEnabled(false);
        }
    }
}

public BluetoothAdapter getBtAdapter() {
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBluetoothAdapter == null) {
        // Device does not support Bluetooth
        return null;
    }
    else {
        return mBluetoothAdapter;
    }
}

public void enableBluetooth() {
    if (!btAdapter.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
}

public void findPairedDevices() {
    pairedDevices = btAdapter.getBondedDevices();
    entries = new ArrayList<CharSequence>();
    entryValues = new ArrayList<CharSequence>();
    for (BluetoothDevice d : pairedDevices) {
        entries.add("paired: " + d.getName());
        entryValues.add(d.getAddress());
    }
    btDevicesList.setEntries(listToArray(entries));
    btDevicesList.setEntryValues(listToArray(entryValues));
}

public void discoverDevices() {
    btAdapter.startDiscovery();
}

public CharSequence[] listToArray(ArrayList<CharSequence> list) {
    CharSequence[] sequence = new CharSequence[list.size()];
    for (int i = 0; i < list.size(); i++) {
        sequence[i] = list.get(i);
    }
    return sequence;
}

private final BroadcastReceiver btDiscoveryReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            discoveredDevices.add(device);

            entries.add("discovered: " + device.getName());
            btDevicesList.setEntries(listToArray(entries));

            entryValues.add(device.getAddress());
            btDevicesList.setEntryValues(listToArray(entryValues));

        }
    }
};

当我使用我的复选框打开蓝牙时,蓝牙打开,但我的 ListPreference 仍然是空的,即使我有一个蓝牙设备 nerby 并且它是可发现的。运行这段代码我没有得到任何错误。感谢您的建议!

最佳答案

您的代码实际上在 btDiscoveryReceiver 中抛出异常,discoveredDevices 从未被初始化。

关于android - 动态添加发现蓝牙设备到 ListPreference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22096058/

相关文章:

android - 如何防止从 Playstore 安装新应用程序?但是应该有更新应用程序的选项

android - 启动 Activity 时获取 java.lang.RuntimeException

android - 如何将帧动画添加到包含按钮状态更改处理的 ImageButton?

android - 无需扫描即可连接其他蓝牙 LE 设备?

android - 如何验证蓝牙耳机是否在安卓上连接?

使用 pybluez 进行 python 蓝牙发现

java - 清除共享首选项

java - 想了解共享偏好限制

java - 改造响应正文为空但状态代码为 200

android - 使用 HoloEveryWhere 单击 ActionBar 上的 SearchView 图标时,如何隐藏子菜单?