我有一个具有以下首选项 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/