Проблема BluetoothLeScanner внутри службы - PullRequest
0 голосов
/ 29 октября 2018

*********************************************** ***********************************

*** решено ******************************************* ************************

*********************************************** ***********************************

Хорошо, я нашел решение ... Я уже давал все разрешения, как «BLUETOOTH_ADMIN», «BLUETOOTH», «ACCESS_COARSE_LOCATION» в манифесте, а также я уже проверял все разрешения в своей функции MainActivity. Но я не знаю, почему я обнаружил, что, если я вручную добавлю разрешение «Доступ к моему местоположению», обратный вызов сканирования начнет работать. Итак, теперь я собираюсь реализовать запрос на разрешение внутри моей MainActivity перед тем, как запустить сервис. Это странно, потому что у меня не было той же проблемы в другом приложении, в котором я выполняю сканирование BLE внутри MainActivity; мое другое приложение, в котором я сканирую внутри MainActivity, не запрашивало это конкретное разрешение, ему просто нужны разрешения «BLUETOOTH» и «BLUETOOTH_ADMIN». Похоже, что «Доступ к моему местоположению» необходим только в том случае, если сканирование будет работать в фоновом режиме.

(я попробовал это на своем устройстве "Huawei P8 Lite" с версией Android "8.0.0")

*********************************************** ***********************************

Я уже попробовал «BluetoothLeScanner» внутри упражнения и не обнаружил никаких проблем во время сканирования. Но теперь, когда я переместил операцию сканирования в службу, у меня возникла проблема.

Это мой сервис:

public class BLEService extends Service {

    private static final int SCAN_TIME_MILLIS = 5000;
    private static final String MY_MAC = "00:15:85:10:85:3C";

    private Handler mHandler;
    private BluetoothAdapter mBluetoothAdapter;
    private BluetoothLeScanner mScanner;
    private ScanCallback mScanCallback;
    private BluetoothGatt mBluetoothGatt;
    private BluetoothGattCallback mGattCallback;
    private int mTxpower;

    @Override
    public void onCreate() {
        super.onCreate();
        mHandler = new Handler();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        initAll();
        startScan();
        return START_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void startScan(){
        mScanner.startScan(mScanCallback);
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                stopScan();
            }
        }, SCAN_TIME_MILLIS);
    }

    private void stopScan(){
        mScanner.stopScan(mScanCallback);
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startScan();
            }
        }, SCAN_TIME_MILLIS);
    }

    private void initAll(){
        initBluetoothAdapter();
        initBluetoothLeScanner();
        initBluetoothScanCallback();
        initGattCallback();
    }

    private void initBluetoothAdapter(){
        final BluetoothManager bluetoothManager = (BluetoothManager) getBaseContext().getSystemService(Context.BLUETOOTH_SERVICE);
        mBluetoothAdapter = bluetoothManager.getAdapter();
        mBluetoothAdapter.startDiscovery();
    }

    private void initBluetoothLeScanner(){
        mScanner = mBluetoothAdapter.getBluetoothLeScanner();
    }

    private void initBluetoothScanCallback(){
        mScanCallback = new ScanCallback() {
            @Override
            public void onScanResult(int callbackType, ScanResult result) {
                super.onScanResult(callbackType, result);
            }

            @Override
            public void onBatchScanResults(List<ScanResult> results) {
                super.onBatchScanResults(results);
            }

            @Override
            public void onScanFailed(int errorCode) {
                super.onScanFailed(errorCode);
            }
        };
    }

    private void initGattCallback(){
        mGattCallback = new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
                super.onConnectionStateChange(gatt, status, newState);
            }

            @Override
            public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
                super.onReadRemoteRssi(gatt, rssi, status);
            }
        };
    }
}

Когда я использую метод "startScan ()", если я просматриваю логи, я вижу, что Сканер был зарегистрирован правильно:

Адаптер I / Bluetooth: getBluetoothLeScanner

Адаптер D / Bluetooth: isLeEnabled (): ВКЛ.

D / BluetoothLeScanner: onScannerRegistered () - статус = 0 scannerId = 7 mScannerId = 0

Таким образом, похоже, что сканирование начинается правильно, но если я пытаюсь отладить обратный вызов сканирования, оно никогда не достигнет моих точек останова. Кто-нибудь может мне помочь, пожалуйста?

Спасибо: D

...