studio activar android bluetooth

activar - bluetooth android studio



Bluetooth para Android: obtenga los UUID de los dispositivos descubiertos (5)

NOTA: Esta solución se aplica al bluetooth CLASSIC y no a BLE . Para BLE verifique cómo enviar datos específicos del fabricante en el anunciante en el lado periférico

El problema con la obtención de Uuids es que solo tiene un adaptador de Bluetooth y no podemos tener llamadas de API paralelas que usen el adaptador para su propósito.

Como señaló Eddie, espere a BluetoothAdapter.ACTION_DISCOVERY_FINISHED y luego llame a fetchUuidsWithSdp() .

Aún así, esto no puede garantizar que los uuids sean buscados para todos los dispositivos. Además de esto, uno debe esperar a que se fetchuuidsWithSdp() cada llamada subsiguiente a fetchuuidsWithSdp() , y luego realizar una llamada a este método para otro dispositivo.

Vea el código a continuación -

ArrayList<BluetoothDevice> mDeviceList = new ArrayList<BluetoothDevice>(); private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); mDeviceList.add(device); } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { // discovery has finished, give a call to fetchUuidsWithSdp on first device in list. if (!mDeviceList.isEmpty()) { BluetoothDevice device = mDeviceList.remove(0); boolean result = device.fetchUuidsWithSdp(); } } else if (BluetoothDevice.ACTION_UUID.equals(action)) { // This is when we can be assured that fetchUuidsWithSdp has completed. // So get the uuids and call fetchUuidsWithSdp on another device in list BluetoothDevice deviceExtra = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID); System.out.println("DeviceExtra address - " + deviceExtra.getAddress()); if (uuidExtra != null) { for (Parcelable p : uuidExtra) { System.out.println("uuidExtra - " + p); } } else { System.out.println("uuidExtra is still null"); } if (!mDeviceList.isEmpty()) { BluetoothDevice device = mDeviceList.remove(0); boolean result = device.fetchUuidsWithSdp(); } } } }

ACTUALIZACIÓN: las últimas versiones de Android (mm y superiores) darán como resultado el inicio de un proceso de sincronización con cada dispositivo

Como actualmente estoy trabajando en una pequeña biblioteca de bluetooth para Android, estoy tratando de obtener todos los uuids de servicio de los dispositivos que descubrí a mi alrededor.

Cuando mi receptor de difusión obtiene el intento BluetoothDevice.ACTION_FOUND , estoy extrayendo el dispositivo y llamo:

device.fetchUuidsWithSdp();

Esto dará como resultado intenciones BluetoothDevice.ACTION_UUID para cada dispositivo encontrado y los manejaré con el mismo receptor:

BluetoothDevice d = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Parcelable[] uuidExtra = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID); if(uuidExtra == null) { Log.e(TAG, "UUID = null"); } if(d != null && uuidExtra != null) Log.d(TAG, d.getName() + ": " + uuidExtra.toString());

La cosa es que uuidExtra siempre es null .

¿Cómo puedo obtener todos los UUID de los dispositivos circundantes?

EDITAR:

Estoy trabajando en un Nexus 7. Intenté el código que encontré en Internet y esto también me da una NullPointerException: http://digitalhacksblog.blogspot.de/2012/05/android-example-bluetooth-discover-and.html

Gracias.


A continuación, trabajé para recuperar los registros del dispositivo remoto.

-0- registerReceiver(.., new IntentFilter(BluetoothDevice.ACTION_UUID));

-1- device.fetchUuidsWithSdp ();

-2-desde dentro del receptor de la carcasa

if (BluetoothDevice.ACTION_UUID.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); Parcelable[] uuids = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID); for (Parcelable ep : uuids) { Utilities.print("UUID records : "+ ep.toString()); } }

También puede obtener los registros UUID en caché sin conexión con

BluetoothDevice.getUuids();


Este es un buen ejemplo de cómo obtener UUID de las características del servicio de un servicio que hice para obtener dispositivos de frecuencia cardíaca:

private class HeartRateBluetoothGattCallback extends BluetoothGattCallback { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { if (newState == BluetoothProfile.STATE_CONNECTED) { logMessage("CONNECTED TO " + gatt.getDevice().getName(), false, false); gatt.discoverServices(); } else if(newState == BluetoothProfile.STATE_DISCONNECTED) { logMessage("DISCONNECTED FROM " + gatt.getDevice().getName(), false, false); if(mIsTrackingHeartRate) handleHeartRateDeviceDisconnection(gatt); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { logMessage("DISCOVERING SERVICES FOR " + gatt.getDevice().getName(), false, false); if(mDesiredHeartRateDevice != null && gatt.getDevice().getAddress().equals(mDesiredHeartRateDevice.getBLEDeviceAddress())) { if(subscribeToHeartRateGattServices(gatt)) { mIsTrackingHeartRate = true; setDeviceScanned(getDiscoveredBLEDevice(gatt.getDevice().getAddress()), DiscoveredBLEDevice.CONNECTED); broadcastHeartRateDeviceConnected(gatt.getDevice()); } else broadcastHeartRateDeviceFailedConnection(gatt.getDevice()); } else { parseGattServices(gatt); disconnectGatt(getDiscoveredBLEDevice(gatt.getDevice().getAddress())); } } } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { if(characteristic.getUuid().equals(UUID.fromString(HEART_RATE_VALUE_CHAR_READ_ID))) { int flag = characteristic.getProperties(); int format = -1; if ((flag & 0x01) != 0) format = BluetoothGattCharacteristic.FORMAT_UINT16; else format = BluetoothGattCharacteristic.FORMAT_UINT8; Integer heartRateValue = characteristic.getIntValue(format, 1); if(heartRateValue != null) broadcastHeartRateValue(heartRateValue); else Log.w(SERVICE_NAME, "UNABLE TO FORMAT HEART RATE DATA"); } }; }; private void parseGattServices(BluetoothGatt gatt) { boolean isHeartRate = false; for(BluetoothGattService blueToothGattService : gatt.getServices()) { logMessage("GATT SERVICE: " + blueToothGattService.getUuid().toString(), false, false); if(blueToothGattService.getUuid().toString().contains(HEART_RATE_DEVICE_SERVICE_CHARACTERISTIC_PREFIX)) isHeartRate = true; } if(isHeartRate) { setDeviceScanned(getDiscoveredBLEDevice(gatt.getDevice().getAddress()), DiscoveredBLEDevice.IS_HEART_RATE); broadcastHeartRateDeviceFound(getDiscoveredBLEDevice(gatt.getDevice().getAddress())); } else setDeviceScanned(getDiscoveredBLEDevice(gatt.getDevice().getAddress()), DiscoveredBLEDevice.NOT_HEART_RATE); } private void handleHeartRateDeviceDisconnection(BluetoothGatt gatt) { broadcastHeartRateDeviceDisconnected(gatt.getDevice()); gatt.close(); clearoutHeartRateData(); scanForHeartRateDevices(); } private void disconnectGatt(DiscoveredBLEDevice device) { logMessage("CLOSING GATT FOR " + device.getBLEDeviceName(), false, false); device.getBlueToothGatt().close(); device.setBlueToothGatt(null); mInDiscoveryMode = false; } private boolean subscribeToHeartRateGattServices(BluetoothGatt gatt) { for(BluetoothGattService blueToothGattService : gatt.getServices()) { if(blueToothGattService.getUuid().toString().contains(HEART_RATE_DEVICE_SERVICE_CHARACTERISTIC_PREFIX)) { mHeartRateGattService = blueToothGattService; for(BluetoothGattCharacteristic characteristic : mHeartRateGattService.getCharacteristics()) { logMessage("CHARACTERISTIC UUID = " + characteristic.getUuid().toString(), false, false); for(BluetoothGattDescriptor descriptor :characteristic.getDescriptors()) { logMessage("DESCRIPTOR UUID = " + descriptor.getUuid().toString(), false, false); } if(characteristic.getUuid().equals(UUID.fromString(HEART_RATE_VALUE_CHAR_READ_ID))) { gatt.setCharacteristicNotification(characteristic, true); BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(HEART_RATE_VALUE_CHAR_DESC_ID)); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); return gatt.writeDescriptor(descriptor); } } break; //break out of master for-loop } } return false; }


La documentation sobre este estado ...

Siempre contiene el campo adicional BluetoothDevice.EXTRA_UUID

Sin embargo, al igual que usted, he descubierto que esto no es cierto.

Si llama a fetchUuidsWithSdp() mientras el descubrimiento del dispositivo todavía se está realizando, BluetoothDevice.EXTRA_UUID puede ser nulo.

Debería esperar hasta que reciba BluetoothAdapter.ACTION_DISCOVERY_FINISHED antes de realizar cualquier llamada a fetchUuidsWithSdp() .


Supongo que necesita estar emparejado con el dispositivo para recibir los uuids. Al menos, esto es lo que me pasó.