use of android.bluetooth.le.ScanFilter in project platform_frameworks_base by android.
the class BluetoothAdapter method startLeScan.
/**
* Starts a scan for Bluetooth LE devices, looking for devices that
* advertise given services.
*
* <p>Devices which advertise all specified services are reported using the
* {@link LeScanCallback#onLeScan} callback.
*
* <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
*
* @param serviceUuids Array of services to look for
* @param callback the callback LE scan results are delivered
* @return true, if the scan was started successfully
* @deprecated use {@link BluetoothLeScanner#startScan(List, ScanSettings, ScanCallback)}
* instead.
*/
@Deprecated
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean startLeScan(final UUID[] serviceUuids, final LeScanCallback callback) {
if (DBG)
Log.d(TAG, "startLeScan(): " + Arrays.toString(serviceUuids));
if (callback == null) {
if (DBG)
Log.e(TAG, "startLeScan: null callback");
return false;
}
BluetoothLeScanner scanner = getBluetoothLeScanner();
if (scanner == null) {
if (DBG)
Log.e(TAG, "startLeScan: cannot get BluetoothLeScanner");
return false;
}
synchronized (mLeScanClients) {
if (mLeScanClients.containsKey(callback)) {
if (DBG)
Log.e(TAG, "LE Scan has already started");
return false;
}
try {
IBluetoothGatt iGatt = mManagerService.getBluetoothGatt();
if (iGatt == null) {
// BLE is not supported
return false;
}
ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
if (callbackType != ScanSettings.CALLBACK_TYPE_ALL_MATCHES) {
// Should not happen.
Log.e(TAG, "LE Scan has already started");
return;
}
ScanRecord scanRecord = result.getScanRecord();
if (scanRecord == null) {
return;
}
if (serviceUuids != null) {
List<ParcelUuid> uuids = new ArrayList<ParcelUuid>();
for (UUID uuid : serviceUuids) {
uuids.add(new ParcelUuid(uuid));
}
List<ParcelUuid> scanServiceUuids = scanRecord.getServiceUuids();
if (scanServiceUuids == null || !scanServiceUuids.containsAll(uuids)) {
if (DBG)
Log.d(TAG, "uuids does not match");
return;
}
}
callback.onLeScan(result.getDevice(), result.getRssi(), scanRecord.getBytes());
}
};
ScanSettings settings = new ScanSettings.Builder().setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
List<ScanFilter> filters = new ArrayList<ScanFilter>();
if (serviceUuids != null && serviceUuids.length > 0) {
// Note scan filter does not support matching an UUID array so we put one
// UUID to hardware and match the whole array in callback.
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(serviceUuids[0])).build();
filters.add(filter);
}
scanner.startScan(filters, settings, scanCallback);
mLeScanClients.put(callback, scanCallback);
return true;
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
}
return false;
}
use of android.bluetooth.le.ScanFilter in project platform_frameworks_base by android.
the class ScanFilterTest method testReadWriteParcel.
@SmallTest
public void testReadWriteParcel() {
ScanFilter filter = mFilterBuilder.build();
testReadWriteParcelForFilter(filter);
filter = mFilterBuilder.setDeviceName("Ped").build();
testReadWriteParcelForFilter(filter);
filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build();
testReadWriteParcelForFilter(filter);
filter = mFilterBuilder.setServiceUuid(ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB")).build();
testReadWriteParcelForFilter(filter);
filter = mFilterBuilder.setServiceUuid(ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB"), ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")).build();
testReadWriteParcelForFilter(filter);
byte[] serviceData = new byte[] { 0x50, 0x64 };
ParcelUuid serviceDataUuid = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData).build();
testReadWriteParcelForFilter(filter);
filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build();
testReadWriteParcelForFilter(filter);
byte[] serviceDataMask = new byte[] { (byte) 0xFF, (byte) 0xFF };
filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData, serviceDataMask).build();
testReadWriteParcelForFilter(filter);
byte[] manufacturerData = new byte[] { 0x02, 0x15 };
int manufacturerId = 0xE0;
filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build();
testReadWriteParcelForFilter(filter);
filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build();
testReadWriteParcelForFilter(filter);
byte[] manufacturerDataMask = new byte[] { (byte) 0xFF, (byte) 0xFF };
filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData, manufacturerDataMask).build();
testReadWriteParcelForFilter(filter);
}
use of android.bluetooth.le.ScanFilter in project platform_frameworks_base by android.
the class ScanFilterTest method testsetServiceUuidFilter.
@SmallTest
public void testsetServiceUuidFilter() {
ScanFilter filter = mFilterBuilder.setServiceUuid(ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB")).build();
assertTrue("uuid filter fails", filter.matches(mScanResult));
filter = mFilterBuilder.setServiceUuid(ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB")).build();
assertFalse("uuid filter fails", filter.matches(mScanResult));
filter = mFilterBuilder.setServiceUuid(ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB"), ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")).build();
assertTrue("uuid filter fails", filter.matches(mScanResult));
}
use of android.bluetooth.le.ScanFilter in project platform_frameworks_base by android.
the class ScanFilterTest method testsetServiceDataFilter.
@SmallTest
public void testsetServiceDataFilter() {
byte[] setServiceData = new byte[] { 0x50, 0x64 };
ParcelUuid serviceDataUuid = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
ScanFilter filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData).build();
assertTrue("service data filter fails", filter.matches(mScanResult));
byte[] emptyData = new byte[0];
filter = mFilterBuilder.setServiceData(serviceDataUuid, emptyData).build();
assertTrue("service data filter fails", filter.matches(mScanResult));
byte[] prefixData = new byte[] { 0x50 };
filter = mFilterBuilder.setServiceData(serviceDataUuid, prefixData).build();
assertTrue("service data filter fails", filter.matches(mScanResult));
byte[] nonMatchData = new byte[] { 0x51, 0x64 };
byte[] mask = new byte[] { (byte) 0x00, (byte) 0xFF };
filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData, mask).build();
assertTrue("partial service data filter fails", filter.matches(mScanResult));
filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData).build();
assertFalse("service data filter fails", filter.matches(mScanResult));
}
use of android.bluetooth.le.ScanFilter in project platform_frameworks_base by android.
the class ScanFilterTest method testDeviceFilter.
@SmallTest
public void testDeviceFilter() {
ScanFilter filter = mFilterBuilder.setDeviceAddress(DEVICE_MAC).build();
assertTrue("device filter fails", filter.matches(mScanResult));
filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build();
assertFalse("device filter fails", filter.matches(mScanResult));
}
Aggregations