Was mache ich falsch? Speichern von ArrayList von BluetoothDevice zu SharedPreferences - Android, Bluetooth, Shared Preferences, Android-Bluetooth, Android-Shared Preferences

Ich schreibe gerade eine Android-Anwendung, um Bluetooth-Geräte zu steuern. Ich versuche eine zu retten ArrayList<BluetoothDevice> zu SharedPreferences mit Gson und Json Klassen, aber wenn ich es versucheWenn ich dieses Codebeispiel auf meinem Telefon ausführe, kann ich nicht den Namen jedes Geräts abrufen, aber ich kann ihre Adressen abrufen. Diesen Fehler sehe ich im Android Monitor-Protokoll (mit Android Studio):

03-28 16: 12: 51.706 17640-17640 /? E / BluetoothDevice: BT nicht aktiviert. Der Name des Remote-Geräts kann nicht abgerufen werden

Ich verwende eine benutzerdefinierte Klasse, um die Liste der Geräte zu verwalten, hier ist der entsprechende Code:

public class DeviceList {

private ArrayList<BluetoothDevice> mDeviceList_bt;
private ArrayList<String> mDeviceList_s;

private ArrayAdapter mAdapter;

private String PREFS_NAME;

SharedPreferences mPrefs;
SharedPreferences.Editor mEditor;

private int i = 0;

public DeviceList(Context c, String Prefs_Name){

this.PREFS_NAME = Prefs_Name;

mDeviceList_bt = new ArrayList<BluetoothDevice>();
mDeviceList_s = new ArrayList<String>();

mPrefs = PreferenceManager.getDefaultSharedPreferences(c);
mEditor = mPrefs.edit();

mAdapter = new ArrayAdapter(c, android.R.layout.simple_list_item_1, mDeviceList_s);
}

public void readFromSharedPrefs(){

Gson gson = new Gson();
String json = mPrefs.getString(PREFS_NAME, null);
Type type = new TypeToken<ArrayList<BluetoothDevice>>() {}.getType();
mDeviceList_bt = gson.fromJson(json, type);

for (BluetoothDevice device : mDeviceList_bt) {
mDeviceList_s.add(device.getName() + "n" + device.getAddress());
}

mAdapter.notifyDataSetChanged();
}

public void saveToSharedPrefs(){
Gson gson = new Gson();
String json = gson.toJson(mDeviceList_bt); // myObject - instance of MyObject
mEditor.putString(PREFS_NAME, json);
mEditor.commit();
}

Zum Beispiel, wenn ich die Liste mit diesen 3 Geräten speichere:

DeviceName1
8C:DE:52:FA:96:0A

DeviceName2
00:3E:01:00:47:4E

DeviceName3
8C:DE:52:FA:B5:F0

Ich bekomme das, nachdem ich gelesen habe SharedPreferences :

null
8C:DE:52:FA:96:0A

null
00:3E:01:00:47:4E

null
8C:DE:52:FA:B5:F0

Irgendeine Idee, was ich falsch mache?

Vielen Dank im Voraus!

Antworten:

1 für die Antwort № 1

Der Gerätename wird nicht in BluetoothDevice gespeichert. Stattdessen wird der Name im BluetoothService zwischengespeichert:

/**
* Get the friendly Bluetooth name of the remote device.
*
* <p>The local adapter will automatically retrieve remote names when
* performing a device scan, and will cache them. This method just returns
* the name for this device from the cache.
* <p>Requires {@link android.Manifest.permission#BLUETOOTH}
*
* @return the Bluetooth name, or null if there was a problem.
*/
public String getName() {
if (sService == null) {
Log.e(TAG, "BT not enabled. Cannot get Remote Device name");
return null;
}
try {
return sService.getRemoteName(this);
} catch (RemoteException e) {Log.e(TAG, "", e);}
return null;
}

Es scheint, dass Ihre deserialised BluetoothDevices sindnicht richtig initialisiert (nicht mit dem Bluetooth-Dienst verbunden). Sie können nur die MAC-Adresse (und den Gerätenamen) in den Einstellungen speichern. Sie können dann verwenden

BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddress);

um ein ordnungsgemäß initialisiertes Gerät zu erhalten.

Beachten Sie, dass es zu Problemen kommen kann, da iOS- und Android-Geräte nach einiger Zeit ihre MAC-Adresse ändern können.


Verwandte Fragen