2016-02-11 2 views
2

Я хотел бы получить собственное имя удаленного устройства Bluetooth в Android. Я говорю о имени, которое содержится в настройках телефона в разделе «Настройки»/«Bluetooth» и «сопряженное устройство».Как получить удаленное устройство пользовательского Bluetooth-имени в Android?

E.g. У меня есть удаленное устройство Bluetooth с именем «DoorControl». В разделе «Настройки-> Bluetooth-> сопряженные устройства я переименовал устройство как« CTRL ». Теперь я хотел бы получить доступ к определенному имени, чтобы отобразить его для пользователя.

Я бы хотел отобразить это имя в списке устройств Bluetooth.

knownDevicesAdapter.clear(); 
knownDevicesArray = mBluetoothAdapter.getBondedDevices(); 

if (knownDevicesArray.size() > 0) { 
    for (BluetoothDevice device : knownDevicesArray) { 
     if (device.getName().contains("Door")) { 
      knownDevicesAdapter.add(device.getName() 
        + /*HERE I WANT THE CUSTOM NAME TO SHOW*/ "\n" 
        + device.getAddress()); 
     } 
    } 
} 

device.getName() возвращает только полное оригинальное имя устройства, что в этом случае «DoorControl».

Это необходимо, так как может быть 4 устройства с именем DoorControl. Единственный способ рассказать разницу между ними - по их адресу. Но для удобного для пользователя подхода было бы намного проще переименовать устройство в настройках Bluetooth и просто показать это имя как «ник» для устройства.

Есть ли способ получить доступ к настраиваемому имени, поэтому мне не нужно писать полное «rename-> сохранить имя для определенного адреса -> загрузить имя« -цикл »в моем приложении?

EDIT:

После поиска на некоторое время, я решил написать переименование возможности в моем собственном приложении, так как я не мог найти способ, чтобы получить имена иначе.

Если кто-то читает это и знает ответ на мой первоначальный вопрос, я был бы рад узнать его.

ответ

2

В приложении, вы можете переименовать устройство Bluetooth, как это:

public boolean renamePairedDevice(BluetoothDevice bluetoothDevice, String name) { 
    try { 
     Method m = bluetoothDevice.getClass().getMethod("setAlias", String.class); 
     m.invoke(bluetoothDevice, name); 
     return true; 
    } catch (Exception e) { 
     Log.d(TAG, "error renaming device:" + e.getMessage()); 
     return false; 
    } 
} 

Затем после этого, bluetoothDevice.getName() возвращает новое имя.

Это имеет такой же эффект, как переименование Bluetooth-устройств в настройках вашего устройства.

+0

Это на самом деле несколько, что я должен был сделать.Все еще не отвечает на мой оригинальный вопрос. Как получить доступ к «нику» из самого приложения, которое люди задают в настройках Bluetooth устройства Android? Я знаю, что это должно быть возможно. Просто не знаю, где андроид сохраняет информацию об именах устройств Bluetooth. Я знаю, как переименовать устройство Bluetooth прямо из приложения, но это неудобно делать в самом приложении, поскольку оно не меняет имя в настройках Android и наоборот. Но спасибо за ваш ответ, может быть, кто-то получит помощь от этого. – Nahkala

1

Проблема, которую я обнаружил, это функция getName() возвращает только имя устройства по умолчанию, а не имя псевдонима, которое пользователь может установить. В моем случае у меня есть несколько одинаковых устройств в паре, а их имя по умолчанию - «Motorola T605». Я не могу сказать им обособленно, поэтому я использую настройки Android для их переименования. Тем не менее, getName() вернул «Motorola T605». Мне нужно было получить псевдоним. Функция для этого существует, но не отображается. Вы можете увидеть это в этом классе Java: https://android.googlesource.com/platform/frameworks/base/+/56a2301/core/java/android/bluetooth/BluetoothDevice.java Это сработало для меня.

Сначала получите массив спаренных устройств:

Set<BluetoothDevice> pairedDevices = mBTA.getBondedDevices(); 

Затем цикл через массив:

for (BluetoothDevice device : pairedDevices) 

Затем посмотреть, если вы можете найти псевдоним:

      String name = null; 

         try { 
          Method m = device.getClass().getMethod("getAlias"); 
          Object res = m.invoke(device); 
          if(res != null) 
          name = res.toString(); 
         } catch (NoSuchMethodException e) { 
          e.printStackTrace(); 
         } catch (InvocationTargetException e) { 
          e.printStackTrace(); 
         } catch (IllegalAccessException e) { 
          e.printStackTrace(); 
         } 

         if(name == null) 
         name = device.getName(); 

Если вы не можете получить псевдоним, получить нормальное имя. Я мог бы лучше справляться с предотвращением и обработкой исключений, но, похоже, это работает.

Смежные вопросы