如何以编程方式清除Android中的蓝牙名称缓存?

问题描述 投票:0回答:2

我注意到,当配对的蓝牙设备名称更改时,我的 Android 设备并不总是注册该名称更改。它继续显示设备的旧名称...对于未配对的设备来说这不是问题,所以我的自然猜测是 Android 将配对设备的名称缓存在某处。

环顾四周后,我发现如果我取消设备配对并手动清除 Android 的“蓝牙共享”应用程序中存储的缓存,这个问题就会消失。当然,当我再次将设备与我的 Android 配对后,问题可能会再次出现。

TL;DR 如何强制 Android 始终显示蓝牙设备的最新名称?

我听说过一些有关“fetchUuidsWithSdp”方法的信息,但我不确定如何使用它。

android caching android-intent bluetooth bluetooth-device-discovery
2个回答
7
投票

是的,fetchUuidsWithSdp() 是一个好主意,因为与 getUuids() 不同,它强制设备尝试连接到目标设备并更新其相关信息。

官方在 4.0.3 中才添加了对 fetchUuidsWithSdp 的支持,但在此之前就可以使用反射来实现。

public static void startFetch( BluetoothDevice device ) {
    // Need to use reflection prior to API 15
    Class cl = null;
    try {
        cl = Class.forName("android.bluetooth.BluetoothDevice");
    } catch( ClassNotFoundException exc ) {
        Log.e(CTAG, "android.bluetooth.BluetoothDevice not found." );
    }
    if (null != cl) {
        Class[] param = {};
        Method method = null;
        try {
            method = cl.getMethod("fetchUuidsWithSdp", param);
        } catch( NoSuchMethodException exc ) {
            Log.e(CTAG, "fetchUuidsWithSdp not found." );
        }
        if (null != method) {
            Object[] args = {};
            try {
                method.invoke(device, args);
            } catch (Exception exc) {
                Log.e(CTAG, "Failed to invoke fetchUuidsWithSdp method." );
            }               
        }
    }
}

通常会注册 android.bluetooth.device.action.UUID,但您可能想注册名称更改操作。

请注意,如果您决定注册 UUID 操作,则在 API 15 之前它会被错误拼写为“android.bleutooth.device.action.UUID”(蓝牙中的 e 和 u 被交换)。


0
投票

为了记住我连接的最后一个设备,我总是将 MAC 地址保存在文件中

© www.soinside.com 2019 - 2024. All rights reserved.