Search in sources :

Example 11 with ScanCallback

use of android.bluetooth.le.ScanCallback in project android-beacon-library by AltBeacon.

the class CycledLeScannerForLollipop method postStartLeScan.

private void postStartLeScan(final List<ScanFilter> filters, final ScanSettings settings) {
    final BluetoothLeScanner scanner = getScanner();
    if (scanner == null) {
        return;
    }
    final ScanCallback scanCallback = getNewLeScanCallback();
    mScanHandler.removeCallbacksAndMessages(null);
    mScanHandler.post(new Runnable() {

        @WorkerThread
        @Override
        public void run() {
            try {
                scanner.startScan(filters, settings, scanCallback);
            } catch (IllegalStateException e) {
                LogManager.w(TAG, "Cannot start scan. Bluetooth may be turned off.");
            } catch (NullPointerException npe) {
                // Necessary because of https://code.google.com/p/android/issues/detail?id=160503
                LogManager.e(npe, TAG, "Cannot start scan. Unexpected NPE.");
            } catch (SecurityException e) {
                // Thrown by Samsung Knox devices if bluetooth access denied for an app
                LogManager.e(TAG, "Cannot start scan.  Security Exception: " + e.getMessage(), e);
            }
        }
    });
}
Also used : BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) WorkerThread(androidx.annotation.WorkerThread) ScanCallback(android.bluetooth.le.ScanCallback)

Example 12 with ScanCallback

use of android.bluetooth.le.ScanCallback 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;
}
Also used : ParcelUuid(android.os.ParcelUuid) BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanResult(android.bluetooth.le.ScanResult) ScanSettings(android.bluetooth.le.ScanSettings) ScanFilter(android.bluetooth.le.ScanFilter) ArrayList(java.util.ArrayList) ScanCallback(android.bluetooth.le.ScanCallback) UUID(java.util.UUID) RemoteException(android.os.RemoteException) ScanRecord(android.bluetooth.le.ScanRecord) RequiresPermission(android.annotation.RequiresPermission)

Example 13 with ScanCallback

use of android.bluetooth.le.ScanCallback in project platform_frameworks_base by android.

the class BluetoothAdapter method stopLeScan.

/**
     * Stops an ongoing Bluetooth LE device scan.
     *
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
     *
     * @param callback used to identify which scan to stop
     *        must be the same handle used to start the scan
     * @deprecated Use {@link BluetoothLeScanner#stopScan(ScanCallback)} instead.
     */
@Deprecated
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public void stopLeScan(LeScanCallback callback) {
    if (DBG)
        Log.d(TAG, "stopLeScan()");
    BluetoothLeScanner scanner = getBluetoothLeScanner();
    if (scanner == null) {
        return;
    }
    synchronized (mLeScanClients) {
        ScanCallback scanCallback = mLeScanClients.remove(callback);
        if (scanCallback == null) {
            if (DBG)
                Log.d(TAG, "scan not started yet");
            return;
        }
        scanner.stopScan(scanCallback);
    }
}
Also used : BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanCallback(android.bluetooth.le.ScanCallback) RequiresPermission(android.annotation.RequiresPermission)

Example 14 with ScanCallback

use of android.bluetooth.le.ScanCallback in project android_frameworks_base by DirtyUnicorns.

the class BluetoothAdapter method stopLeScan.

/**
     * Stops an ongoing Bluetooth LE device scan.
     *
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
     *
     * @param callback used to identify which scan to stop
     *        must be the same handle used to start the scan
     * @deprecated Use {@link BluetoothLeScanner#stopScan(ScanCallback)} instead.
     */
@Deprecated
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public void stopLeScan(LeScanCallback callback) {
    if (DBG)
        Log.d(TAG, "stopLeScan()");
    BluetoothLeScanner scanner = getBluetoothLeScanner();
    if (scanner == null) {
        return;
    }
    synchronized (mLeScanClients) {
        ScanCallback scanCallback = mLeScanClients.remove(callback);
        if (scanCallback == null) {
            if (DBG)
                Log.d(TAG, "scan not started yet");
            return;
        }
        scanner.stopScan(scanCallback);
    }
}
Also used : BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanCallback(android.bluetooth.le.ScanCallback) RequiresPermission(android.annotation.RequiresPermission)

Example 15 with ScanCallback

use of android.bluetooth.le.ScanCallback in project android_frameworks_base by ResurrectionRemix.

the class BluetoothAdapter method stopLeScan.

/**
     * Stops an ongoing Bluetooth LE device scan.
     *
     * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission.
     *
     * @param callback used to identify which scan to stop
     *        must be the same handle used to start the scan
     * @deprecated Use {@link BluetoothLeScanner#stopScan(ScanCallback)} instead.
     */
@Deprecated
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public void stopLeScan(LeScanCallback callback) {
    if (DBG)
        Log.d(TAG, "stopLeScan()");
    BluetoothLeScanner scanner = getBluetoothLeScanner();
    if (scanner == null) {
        return;
    }
    synchronized (mLeScanClients) {
        ScanCallback scanCallback = mLeScanClients.remove(callback);
        if (scanCallback == null) {
            if (DBG)
                Log.d(TAG, "scan not started yet");
            return;
        }
        scanner.stopScan(scanCallback);
    }
}
Also used : BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanCallback(android.bluetooth.le.ScanCallback) RequiresPermission(android.annotation.RequiresPermission)

Aggregations

ScanCallback (android.bluetooth.le.ScanCallback)24 BluetoothLeScanner (android.bluetooth.le.BluetoothLeScanner)20 ScanResult (android.bluetooth.le.ScanResult)17 ScanSettings (android.bluetooth.le.ScanSettings)14 RequiresPermission (android.annotation.RequiresPermission)10 BluetoothAdapter (android.bluetooth.BluetoothAdapter)8 List (java.util.List)8 ScanFilter (android.bluetooth.le.ScanFilter)6 ParcelUuid (android.os.ParcelUuid)6 ScanRecord (android.bluetooth.le.ScanRecord)5 RemoteException (android.os.RemoteException)5 ArrayList (java.util.ArrayList)5 UUID (java.util.UUID)5 TargetApi (android.annotation.TargetApi)3 BluetoothDevice (android.bluetooth.BluetoothDevice)2 WorkerThread (androidx.annotation.WorkerThread)2 ActiveBluetoothDevice (com.eveningoutpost.dexdrip.Models.ActiveBluetoothDevice)2 PendingIntent (android.app.PendingIntent)1 Intent (android.content.Intent)1 RequiresApi (androidx.annotation.RequiresApi)1