Search in sources :

Example 6 with ScanResult

use of android.bluetooth.le.ScanResult in project platform_packages_apps_Settings by BlissRoms.

the class AnomalyActions method doUnoptimizedBleScan.

private static void doUnoptimizedBleScan(Context ctx, long durationMs) {
    ScanSettings scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
    // perform ble scanning
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
        Log.e(TAG, "Device does not support Bluetooth or Bluetooth not enabled");
        return;
    }
    BluetoothLeScanner bleScanner = bluetoothAdapter.getBluetoothLeScanner();
    if (bleScanner == null) {
        Log.e(TAG, "Cannot access BLE scanner");
        return;
    }
    ScanCallback scanCallback = new ScanCallback() {

        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            Log.v(TAG, "called onScanResult");
        }

        @Override
        public void onScanFailed(int errorCode) {
            Log.v(TAG, "called onScanFailed");
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            Log.v(TAG, "called onBatchScanResults");
        }
    };
    bleScanner.startScan(null, scanSettings, scanCallback);
    try {
        Thread.sleep(durationMs);
    } catch (InterruptedException e) {
        Log.e(TAG, "Thread couldn't sleep for " + durationMs, e);
    }
    bleScanner.stopScan(scanCallback);
}
Also used : ScanSettings(android.bluetooth.le.ScanSettings) BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanResult(android.bluetooth.le.ScanResult) ScanCallback(android.bluetooth.le.ScanCallback) List(java.util.List) BluetoothAdapter(android.bluetooth.BluetoothAdapter)

Example 7 with ScanResult

use of android.bluetooth.le.ScanResult in project PhoneProfilesPlus by henrichg.

the class BluetoothLEScanCallback21 method onBatchScanResults.

public void onBatchScanResults(List<ScanResult> results) {
    CallsCounter.logCounter(context, "BluetoothLEScanCallback21.onBatchScanResults", "BluetoothLEScanCallback21.onBatchScanResults");
    boolean scanStarted = (BluetoothScanJob.getWaitForLEResults(context));
    if (scanStarted) {
        for (ScanResult result : results) {
            // PPApplication.logE("BluetoothLEScanCallback21", "onBatchScanResults - result=" + result.toString());
            BluetoothDevice device = result.getDevice();
            String btName = device.getName();
            PPApplication.logE("BluetoothLEScanCallback21", "onBatchScanResults - deviceName=" + btName);
            BluetoothDeviceData deviceData = new BluetoothDeviceData(btName, device.getAddress(), BluetoothScanJob.getBluetoothType(device), false, 0);
            BluetoothScanJob.addLEScanResult(deviceData);
        }
    }
}
Also used : ScanResult(android.bluetooth.le.ScanResult) BluetoothDevice(android.bluetooth.BluetoothDevice)

Example 8 with ScanResult

use of android.bluetooth.le.ScanResult in project Resurrection_packages_apps_Settings by ResurrectionRemix.

the class AnomalyActions method doUnoptimizedBleScan.

private static void doUnoptimizedBleScan(Context ctx, long durationMs) {
    ScanSettings scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
    // perform ble scanning
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
        Log.e(TAG, "Device does not support Bluetooth or Bluetooth not enabled");
        return;
    }
    BluetoothLeScanner bleScanner = bluetoothAdapter.getBluetoothLeScanner();
    if (bleScanner == null) {
        Log.e(TAG, "Cannot access BLE scanner");
        return;
    }
    ScanCallback scanCallback = new ScanCallback() {

        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            Log.v(TAG, "called onScanResult");
        }

        @Override
        public void onScanFailed(int errorCode) {
            Log.v(TAG, "called onScanFailed");
        }

        @Override
        public void onBatchScanResults(List<ScanResult> results) {
            Log.v(TAG, "called onBatchScanResults");
        }
    };
    bleScanner.startScan(null, scanSettings, scanCallback);
    try {
        Thread.sleep(durationMs);
    } catch (InterruptedException e) {
        Log.e(TAG, "Thread couldn't sleep for " + durationMs, e);
    }
    bleScanner.stopScan(scanCallback);
}
Also used : ScanSettings(android.bluetooth.le.ScanSettings) BluetoothLeScanner(android.bluetooth.le.BluetoothLeScanner) ScanResult(android.bluetooth.le.ScanResult) ScanCallback(android.bluetooth.le.ScanCallback) List(java.util.List) BluetoothAdapter(android.bluetooth.BluetoothAdapter)

Example 9 with ScanResult

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

the class ScanJob method onStartJob.

@Override
public boolean onStartJob(final JobParameters jobParameters) {
    // We start off on the main UI thread here.
    // But the ScanState restore from storage sometimes hangs, so we start new thread here just
    // to kick that off.  This way if the restore hangs, we don't hang the UI thread.
    LogManager.i(TAG, "ScanJob Lifecycle START: " + ScanJob.this);
    new Thread(new Runnable() {

        public void run() {
            IntentScanStrategyCoordinator intentStrategyCoord = BeaconManager.getInstanceForApplication(ScanJob.this).getIntentScanStrategyCoordinator();
            if (intentStrategyCoord != null) {
                // cycle.
                synchronized (ScanJob.this) {
                    if (mStopCalled) {
                        LogManager.d(TAG, "Quitting scan job before we even start.  Somebody told us to stop.");
                        ScanJob.this.jobFinished(jobParameters, false);
                        return;
                    }
                    LogManager.d(TAG, "Scan job calling IntentScanStrategyCoordinator");
                    intentStrategyCoord.performPeriodicProcessing(ScanJob.this);
                    LogManager.d(TAG, "Scan job finished.  Calling jobFinished");
                    ScanJob.this.jobFinished(jobParameters, false);
                    return;
                }
            }
            if (!initialzeScanHelper()) {
                LogManager.e(TAG, "Cannot allocate a scanner to look for beacons.  System resources are low.");
                ScanJob.this.jobFinished(jobParameters, false);
            }
            ScanJobScheduler.getInstance().ensureNotificationProcessorSetup(getApplicationContext());
            if (jobParameters.getJobId() == getImmediateScanJobId(ScanJob.this)) {
                LogManager.i(TAG, "Running immediate scan job: instance is " + ScanJob.this);
            } else {
                LogManager.i(TAG, "Running periodic scan job: instance is " + ScanJob.this);
            }
            List<ScanResult> queuedScanResults = new ArrayList<>(ScanJobScheduler.getInstance().dumpBackgroundScanResultQueue());
            LogManager.d(TAG, "Processing %d queued scan results", queuedScanResults.size());
            for (ScanResult result : queuedScanResults) {
                ScanRecord scanRecord = result.getScanRecord();
                if (scanRecord != null) {
                    if (mScanHelper != null) {
                        mScanHelper.processScanResult(result.getDevice(), result.getRssi(), scanRecord.getBytes(), System.currentTimeMillis() - SystemClock.elapsedRealtime() + result.getTimestampNanos() / 1000000);
                    }
                }
            }
            LogManager.d(TAG, "Done processing queued scan results");
            // closing out the CycledScanner
            synchronized (ScanJob.this) {
                if (mStopCalled) {
                    LogManager.d(TAG, "Quitting scan job before we even start.  Somebody told us to stop.");
                    ScanJob.this.jobFinished(jobParameters, false);
                    return;
                }
                boolean startedScan;
                if (mInitialized) {
                    LogManager.d(TAG, "Scanning already started.  Resetting for current parameters");
                    startedScan = restartScanning();
                } else {
                    startedScan = startScanning();
                }
                mStopHandler.removeCallbacksAndMessages(null);
                if (startedScan) {
                    if (mScanState != null) {
                        LogManager.i(TAG, "Scan job running for " + mScanState.getScanJobRuntimeMillis() + " millis");
                        mStopHandler.postDelayed(new Runnable() {

                            @Override
                            public void run() {
                                LogManager.i(TAG, "Scan job runtime expired: " + ScanJob.this);
                                stopScanning();
                                mScanState.save();
                                ScanJob.this.jobFinished(jobParameters, false);
                                // need to execute this after the current block or Android stops this job prematurely
                                mStopHandler.post(new Runnable() {

                                    @Override
                                    public void run() {
                                        scheduleNextScan();
                                    }
                                });
                            }
                        }, mScanState.getScanJobRuntimeMillis());
                    }
                } else {
                    LogManager.i(TAG, "Scanning not started so Scan job is complete.");
                    stopScanning();
                    mScanState.save();
                    LogManager.d(TAG, "ScanJob Lifecycle STOP (start fail): " + ScanJob.this);
                    ScanJob.this.jobFinished(jobParameters, false);
                }
            }
        }
    }).start();
    return true;
}
Also used : ScanResult(android.bluetooth.le.ScanResult) ArrayList(java.util.ArrayList) ScanRecord(android.bluetooth.le.ScanRecord)

Example 10 with ScanResult

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

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