From 4e173659e9a310b7eb0eba3d397875fc4115b2cf Mon Sep 17 00:00:00 2001 From: Alexandros Schillings Date: Mon, 13 Jul 2015 17:13:06 +0100 Subject: [PATCH] We can now list supported bluetooth services --- .../device/BluetoothLeDevice.java | 23 +++++++++++++++ .../device/BluetoothService.java | 28 +++++++++++++++++++ .../activities/DeviceDetailsActivity.java | 20 +++++++++++++ .../res/layout/list_item_view_device_info.xml | 10 +++++++ sample_app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 83 insertions(+) create mode 100644 library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothService.java diff --git a/library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothLeDevice.java b/library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothLeDevice.java index aebed51..c54bf5e 100644 --- a/library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothLeDevice.java +++ b/library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothLeDevice.java @@ -7,7 +7,10 @@ import android.os.Parcelable; import java.io.Serializable; import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import uk.co.alt236.bluetoothlelib.device.adrecord.AdRecordStore; import uk.co.alt236.bluetoothlelib.resolvers.BluetoothClassResolver; @@ -55,6 +58,7 @@ public class BluetoothLeDevice implements Parcelable { private final long mFirstTimestamp; private int mCurrentRssi; private long mCurrentTimestamp; + private transient Set mServiceSet; /** * Instantiates a new Bluetooth LE device. @@ -221,6 +225,25 @@ public class BluetoothLeDevice implements Parcelable { return BluetoothClassResolver.resolveMajorDeviceClass(mDevice.getBluetoothClass().getMajorDeviceClass()); } + public Set getBluetoothDeviceKnownSupportedServices() { + if (mServiceSet == null) { + synchronized (this) { + if (mServiceSet == null) { + final Set serviceSet = new HashSet<>(); + for (final BluetoothService service : BluetoothService.values()) { + + if (mDevice.getBluetoothClass().hasService(service.getAndroidConstant())) { + serviceSet.add(service); + } + } + mServiceSet = Collections.unmodifiableSet(serviceSet); + } + } + } + + return mServiceSet; + } + /** * Gets the device. * diff --git a/library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothService.java b/library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothService.java new file mode 100644 index 0000000..c4ec277 --- /dev/null +++ b/library/src/main/java/uk/co/alt236/bluetoothlelib/device/BluetoothService.java @@ -0,0 +1,28 @@ +package uk.co.alt236.bluetoothlelib.device; + +import android.bluetooth.BluetoothClass; + +/** + * + */ +public enum BluetoothService { + AUDIO(BluetoothClass.Service.AUDIO), + CAPTURE(BluetoothClass.Service.CAPTURE), + INFORMATION(BluetoothClass.Service.INFORMATION), + LIMITED_DISCOVERABILITY(BluetoothClass.Service.LIMITED_DISCOVERABILITY), + NETWORKING(BluetoothClass.Service.NETWORKING), + OBJECT_TRANSFER(BluetoothClass.Service.OBJECT_TRANSFER), + POSITIONING(BluetoothClass.Service.POSITIONING), + RENDER(BluetoothClass.Service.RENDER), + TELEPHONY(BluetoothClass.Service.TELEPHONY); + + private final int mAndroidConstant; + + BluetoothService(final int androidCode){ + mAndroidConstant = androidCode; + } + + public int getAndroidConstant(){ + return mAndroidConstant; + } +} diff --git a/sample_app/src/main/java/uk/co/alt236/btlescan/activities/DeviceDetailsActivity.java b/sample_app/src/main/java/uk/co/alt236/btlescan/activities/DeviceDetailsActivity.java index 644b5f4..bb6abdb 100644 --- a/sample_app/src/main/java/uk/co/alt236/btlescan/activities/DeviceDetailsActivity.java +++ b/sample_app/src/main/java/uk/co/alt236/btlescan/activities/DeviceDetailsActivity.java @@ -19,6 +19,7 @@ import java.util.Locale; import butterknife.Bind; import butterknife.ButterKnife; import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice; +import uk.co.alt236.bluetoothlelib.device.BluetoothService; import uk.co.alt236.bluetoothlelib.device.adrecord.AdRecord; import uk.co.alt236.bluetoothlelib.device.mfdata.IBeaconManufacturerData; import uk.co.alt236.bluetoothlelib.resolvers.CompanyIdentifierResolver; @@ -56,6 +57,7 @@ public class DeviceDetailsActivity extends AppCompatActivity { final TextView tvAddress = (TextView) lt.findViewById(R.id.deviceAddress); final TextView tvClass = (TextView) lt.findViewById(R.id.deviceClass); final TextView tvMajorClass = (TextView) lt.findViewById(R.id.deviceMajorClass); + final TextView tvServices = (TextView) lt.findViewById(R.id.deviceServiceList); final TextView tvBondingState = (TextView) lt.findViewById(R.id.deviceBondingState); tvName.setText(device.getName()); @@ -64,6 +66,24 @@ public class DeviceDetailsActivity extends AppCompatActivity { tvMajorClass.setText(device.getBluetoothDeviceMajorClassName()); tvBondingState.setText(device.getBluetoothDeviceBondState()); + final String supportedServices; + if(device.getBluetoothDeviceKnownSupportedServices().isEmpty()){ + supportedServices = getString(R.string.no_known_services); + } else { + final StringBuilder sb = new StringBuilder(); + + for(final BluetoothService service : device.getBluetoothDeviceKnownSupportedServices()){ + if(sb.length() > 0){ + sb.append(", "); + } + + sb.append(service); + } + supportedServices = sb.toString(); + } + + tvServices.setText(supportedServices); + adapter.addView(lt); } diff --git a/sample_app/src/main/res/layout/list_item_view_device_info.xml b/sample_app/src/main/res/layout/list_item_view_device_info.xml index 459e35a..239480f 100644 --- a/sample_app/src/main/res/layout/list_item_view_device_info.xml +++ b/sample_app/src/main/res/layout/list_item_view_device_info.xml @@ -52,6 +52,16 @@ android:id="@+id/deviceMajorClass" style="@style/GridLayoutDataTextView"/> + + + + Unknown characteristic Unknown device Unknown service + No known services %sm @@ -54,6 +55,7 @@ Device address: Device Class: Major Class: + Services: Device Name: Distance: First RSSI: