Search in sources :

Example 11 with BluetoothLeScanner

use of android.bluetooth.le.BluetoothLeScanner 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() {

        @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(TAG, "Cannot start scan. Unexpected NPE.", npe);
            } catch (SecurityException e) {
                // Thrown by Samsung Knox devices if bluetooth access denied for an app
                LogManager.e(TAG, "Cannot start scan.  Security Exception");
            }
        }
    });
}
Also used : BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanCallback(android.bluetooth.le.ScanCallback)

Example 12 with BluetoothLeScanner

use of android.bluetooth.le.BluetoothLeScanner in project android_frameworks_base by crdroidandroid.

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 13 with BluetoothLeScanner

use of android.bluetooth.le.BluetoothLeScanner in project android_frameworks_base by crdroidandroid.

the class KeyboardUI method startScanning.

private void startScanning() {
    BluetoothLeScanner scanner = mLocalBluetoothAdapter.getBluetoothLeScanner();
    ScanFilter filter = (new ScanFilter.Builder()).setDeviceName(mKeyboardName).build();
    ScanSettings settings = (new ScanSettings.Builder()).setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).setNumOfMatches(ScanSettings.MATCH_NUM_ONE_ADVERTISEMENT).setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).setReportDelay(0).build();
    mScanCallback = new KeyboardScanCallback();
    scanner.startScan(Arrays.asList(filter), settings, mScanCallback);
    Message abortMsg = mHandler.obtainMessage(MSG_BLE_ABORT_SCAN, ++mScanAttempt, 0);
    mHandler.sendMessageDelayed(abortMsg, BLUETOOTH_SCAN_TIMEOUT_MILLIS);
}
Also used : BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanSettings(android.bluetooth.le.ScanSettings) Message(android.os.Message) ScanFilter(android.bluetooth.le.ScanFilter)

Example 14 with BluetoothLeScanner

use of android.bluetooth.le.BluetoothLeScanner in project android_frameworks_base by crdroidandroid.

the class KeyboardUI method stopScanning.

private void stopScanning() {
    if (mScanCallback != null) {
        BluetoothLeScanner scanner = mLocalBluetoothAdapter.getBluetoothLeScanner();
        if (scanner != null) {
            scanner.stopScan(mScanCallback);
        }
        mScanCallback = null;
    }
}
Also used : BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner)

Example 15 with BluetoothLeScanner

use of android.bluetooth.le.BluetoothLeScanner 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)

Aggregations

BluetoothLeScanner (android.bluetooth.le.BluetoothLeScanner)22 ScanCallback (android.bluetooth.le.ScanCallback)12 RequiresPermission (android.annotation.RequiresPermission)10 ScanFilter (android.bluetooth.le.ScanFilter)10 ScanSettings (android.bluetooth.le.ScanSettings)10 ScanRecord (android.bluetooth.le.ScanRecord)5 ScanResult (android.bluetooth.le.ScanResult)5 Message (android.os.Message)5 ParcelUuid (android.os.ParcelUuid)5 RemoteException (android.os.RemoteException)5 ArrayList (java.util.ArrayList)5 UUID (java.util.UUID)5