1

Bluetooth デバイスから情報を受け取る Android アプリを作成しています。私たちのクライアントは、特定の条件に応じて Bluetooth デバイス (彼らが製造する) の名前を変更することを提案しました。私のアプリは、この BT トランスミッター (私は BluetoothAdapter.startDiscovery() を使用します) を探し、見つかった名前に応じてさまざまなことを行うことになっています。私はBluetoothデバイスとペアリングしていません(可能かもしれませんが、アプリは最終的に複数のAndroidデバイスと複数のBTトランスミッターで動作するはずなので、それが良い考えかどうかはわかりません).

私のコードは正常に動作し、BT デバイスを検出してその名前を見つけます。また、デバイスがオフになった場合、次にシークしたときにデバイスが存在しないことを検出できます。しかし、それがそこにあり、名前が変更された場合、古い名前を取得するようです-おそらくどこかにキャッシュされています。Bluetooth デバイスがオフになったとしても、次にそれを検出したときに古い名前が表示されることに気付きました。

Google Code: hereでこの問題を見つけましたが、指定された回避策 (「接続を試行」) の使用方法さえわかりませんでした。誰かがこれを行い、運が良かったですか? コードを共有できますか?

キャッシュされた名前を削除して再度検索し、常に最新の名前を見つける簡単な方法はありますか? 単純ではない方法でも良いでしょう (ルート化されたデバイスについて書いています)。

ありがとう

4

1 に答える 1

2

'fetchUuidsWithSdp()'をお勧めします。重要なのは、同様のgetUuids()メソッドとは異なり、fetchUuidsWithSdpにより、デバイスがリモートデバイスに関するキャッシュされた情報を更新することです。これには、リモート名とSPDが含まれると思います。

私が言及した両方のメソッドは4.0.3より前では非表示になっているため、コードは次のようになります。

public static void startServiceDiscovery( 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." );
            }               
        }
    }
}

次に、BluetoothDevice.ACTION_NAME_CHANGEDインテントをリッスンし、そこからBluetoothDevice.EXTRA_NAMEを抽出する必要があります。

それが役に立ったら教えてください。

于 2012-04-16T15:30:53.340 に答える