Динамически добавлять обнаруженные устройства Bluetooth в ListPreference
У меня есть PreferenceFragment со следующим предпочтением xml-ресурса:
<?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, я включаю Bluetooth, ищу сопряженные устройства, а также обнаруживаю другие устройства и добавляю их все в 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));
}
}
};
}
Когда я включаю Bluetooth с помощью своего флажка, Bluetooth включается, но моя ListPreference остается пустой, даже если у меня Bluetooth-устройство ненадежное и его можно обнаружить. Я не получаю ошибок при запуске этого кода. Спасибо за совет!
1 ответ
Ваш код фактически вызывает исключение в btDiscoveryReceiver, так как обнаруженные устройства никогда не инициализируются.