Android Bluetooth: fetchUuidsWithSdp () gibt auf einigen Geräten nicht alle UUIDs zurück

Ich habe zwei verschiedene Bluetooth-Apps. Der erste Dienst bietet einen Dienst und lauscht den Befehlen der anderen Commander-App. Ich habe ein GT-I9100T-Telefon und ein GT-P5210-Tablet. Das Tablet funktioniert einwandfrei, wenn Sie als Zuhörer fungieren, und das Telefon kann die UUID für meine App anzeigen. Wenn ich das Telefon jedoch als Listener verwende, wird die UUID des Listeners nicht aufgelistet.

Ich filtere die Geräte nach der UUID meiner Anwendung, sodass ich weiß, dass ich nur mit diesen Geräten spreche, auf denen meine Anwendung ausgeführt wird.

Meine Hör-App sieht so aus (ich erhalte das gleiche Ergebnis, wenn ich auch eine unsichere Verbindung verwende):

private final UUID GUID = UUID.fromString("3DEF793A-FA94-4478-AE56-108854B1EF4B");
// other stuff....
tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(APP_NAME, GUID);

Meine Kommandanten-App MainActivity sieht so aus:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        Log.i(TAG,"Action received: "+action);
        if(action.equals(BluetoothDevice.ACTION_UUID)) {
             BluetoothDevice btd = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
             Log.i(TAG,"Received uuids for "+btd.getName());
             Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);
             StringBuilder sb = new StringBuilder();
             List<String> uuids = new ArrayList<String>(uuidExtra.length);
             if(uuidExtra != null) {
                 for (int i = 0; i < uuidExtra.length; i++) {
                    sb.append(uuidExtra[i].toString()).append(',');
                    uuids.add(uuidExtra[i].toString());
                 }
             }
             Log.i(TAG,"ACTION_UUID received for "+btd.getName()+" uuids: "+sb.toString());
             ListContent.addItemWithUUIDs(btd, uuids);
        }
    }
}

Mein Listeninhalt (ich verwende die Master / Detail-Vorlage):

public static synchronized void addItem(BluetoothItem item) {
        BluetoothDevice btd = item.mBluetoothDevice;
        Log.i(TAG,"Attempting to add "+item.mBluetoothDevice.getName());
        if(ITEMS.contains(item)) {
            Log.i(TAG,item.mBluetoothDevice.getName()+" already in list");
            return;
        }
        // Do we know this device?
        Parcelable[] uuids =  btd.getUuids();
        Set<String> setUUIDs = new HashSet<String>();
        StringBuilder sb = new StringBuilder();
        if(uuids != null) {
            for (Parcelable parcelable : uuids) {
                sb.append(parcelable.toString()).append(',');
                setUUIDs.add(parcelable.toString());
            }
        }
        Log.v(TAG,"Device has uuids: "+sb.toString());
        if ((btd.getUuids() != null && setUUIDs.contains(BluetoothItem.GUID.toLowerCase()))){
            Log.i(TAG, "Found app device: " + btd.getName());
            addItem(btd);
        } else {
            // If we don't know this device, perform sdp fetch of uuids
            Log.i(TAG,"Requesting fresh UUIDs for: "+btd.getName());
            // this is flushed when discovering finishes
            CANDIDATES.add(btd);
        }
    }
    public static synchronized void addItemWithUUIDs(BluetoothDevice btd, List<String> uuids) {
        Log.i(TAG,"Attempting to add with uuids"+btd.getName()+" uuids: "+btd.getUuids());
        if (uuids.contains(BluetoothItem.GUID)) {
            Log.i(TAG, "Found app device: " + btd.getName());
            addItem(btd);
        } else {
            Log.i(TAG, "Ignoring device " + btd.getName() + " without app guid");
        }
    }

Wenn die Ermittlung abgeschlossen ist, geschieht Folgendes:

for (BluetoothDevice i : ListContent.CANDIDATES) {
    Log.i(TAG,"Fetching UUIDs for "+i.getName());
    i.fetchUuidsWithSdp();
}
ListContent.CANDIDATES.clear();

Die logcat-Ausgabe bei Verwendung des Tablets als Commander und des Telefons als Listener:

DeviceListActivity(29524): Received uuids for GT-I9100T
DeviceListActivity(29524): ACTION_UUID received for GT-I9100T uuids:
0000110a-0000-1000-8000-00805f9b34fb,
00001105-0000-1000-8000-00805f9b34fb,
00001116-0000-1000-8000-00805f9b34fb,
0000112d-0000-1000-8000-00805f9b34fb,
0000112f-0000-1000-8000-00805f9b34fb,
00001112-0000-1000-8000-00805f9b34fb,
0000111f-0000-1000-8000-00805f9b34fb,
00001132-0000-1000-8000-00805f9b34fb,

Ich erhalte die richtige Ausgabe mit dem Telefon als Commander und dem Tablet als Listener:

DeviceListActivity(23121): Received uuids for GT-P5210
DeviceListActivity(23121): ACTION_UUID received for GT-P5210 uuids:
00001105-0000-1000-8000-00805f9b34fb,
0000110a-0000-1000-8000-00805f9b34fb,
0000110c-0000-1000-8000-00805f9b34fb,
00001112-0000-1000-8000-00805f9b34fb,
00001115-0000-1000-8000-00805f9b34fb,
0000111f-0000-1000-8000-00805f9b34fb,
00001200-0000-1000-8000-00805f9b34fb,
3def793a-fa94-4478-ae56-108854b1ef4b,

Wie Sie sehen, wird die GUID für meine App als letztes Element aufgeführt. Ich habe versucht, die Geräte erkennbar und bindend zu machen, aber die GUID für meine App wird nie für das Telefon zurückgegeben. Ich habe andere Nicht-Android-Geräte, die ebenfalls diese GUID verwenden, und sie werden auch normal erkannt.

Das Telefon ist mit Version 4.1.2 und das Tablet mit Version 4.2.2 ausgestattet.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage