Что я делаю не так? Сохранение ArrayList BluetoothDevice в SharedPreferences

В настоящее время я пишу приложение для Android для управления устройствами Bluetooth. Я пытаюсь сохранить от ArrayList<BluetoothDevice> до SharedPreferences, используя классы Gson и Json, но когда я пытаюсь запустить этот фрагмент кода на своем телефоне, я не могу получить имя каждого устройства, но могу получить их адреса. Я вижу эту ошибку в журнале Android Monitor (используя Android Studio):

03-28 16:12:51.706 17640-17640/? E/BluetoothDevice: BT не включен. Не удается получить имя удаленного устройства

Я использую собственный класс для управления списком устройств, вот соответствующий код:

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();
}

Например, если я сохраню список с этими тремя устройствами:

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

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

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

Я получаю это после того, как прочитал от SharedPreferences :

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

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

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

Любая идея, что я делаю неправильно?

Заранее спасибо!


person Guillaume P.    schedule 28.03.2016    source источник


Ответы (1)


Имя устройства не сохраняется в BluetoothDevice. Вместо этого имя кэшируется в BluetoothService:

/**
 * 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;
}

Кажется, что ваши десериализованные устройства BluetoothDevices неправильно инициализированы (не подключены к службе Bluetooth). Что вы можете сделать, так это сохранить только MAC-адрес (и имя устройства) в настройках. Затем вы можете использовать

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

чтобы получить правильно инициализированное устройство.

Имейте в виду, что вы можете столкнуться с проблемами, поскольку устройства iOS и Android могут изменить свой MAC-адрес через некоторое время.

person p2pkit    schedule 30.03.2016
comment
Спасибо, очень помогите мне! - person Guillaume P.; 12.04.2016