【问题标题】:How to get remote devices custom Bluetooth name in Android?如何在 Android 中获取远程设备自定义蓝牙名称?
【发布时间】:2016-02-11 11:07:42
【问题描述】:

我想在 Android 中检索远程蓝牙设备的自定义名称。 我说的是设置/蓝牙和配对设备下的手机设置中的名称。

例如我有一个名为“DoorControl”的远程蓝牙设备。在设置->蓝牙->配对设备下,我已将设备重命名为“CTRL”。现在我想访问定义的名称,以便为用户显示它。

我想在蓝牙设备列表中显示该名称。

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 的设备。区分它们的唯一方法是通过它们的地址。但是对于用户友好的方法,让他们在蓝牙设置中重命名设备并仅将该名称显示为设备的“昵称”会更容易。

有没有办法访问自定义名称,所以我不必在自己的应用程序中编写完整的“重命名->保存特定地址的名称->加载名称”-循环?

编辑:

搜索了一段时间后,我决定在自己的应用程序中编写重命名功能,因为我找不到其他方法来获取名称。

如果有人正在阅读本文并知道我最初问题的答案,我会很高兴知道。

【问题讨论】:

    标签: java android bluetooth


    【解决方案1】:

    在您的应用中,您可以像这样重命名蓝牙设备:

    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() 将返回新名称。

    这与在设备设置中重命名蓝牙设备的效果相同。

    【讨论】:

    • 这实际上是我必须做的。仍然没有回答我原来的问题..如何从应用程序本身访问人们在 android 设备的蓝牙设置中设置的“昵称”?我知道这一定是可能的。只是不知道android在哪里保存蓝牙设备名称的信息。我知道如何直接从应用程序重命名蓝牙设备,但是在应用程序本身这样做很不方便,因为它不会更改名称android设置,反之亦然。不过谢谢你的回答,也许有人能从中得到帮助。
    【解决方案2】:

    我发现的问题是 getName() 函数只返回默认设备名称,而不是用户可以设置的别名。就我而言,我配对了多个相同的设备,它们的默认名称是“摩托罗拉 T605”。我无法区分它们,所以我使用 Android 设置来重命名它们。尽管如此,getName() 还是返回了“摩托罗拉 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();
    

    如果您无法获取别名,请获取正常名称。我可以更好地防止和处理异常,但它似乎有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2020-07-02
      • 2014-08-05
      相关资源
      最近更新 更多