服务内部的BluetoothLeScanner问题

时间:2018-10-29 16:55:17

标签: android bluetooth bluetooth-lowenergy


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

***解决了*********************************************** ************************

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

好,我找到了解决方案...我已经授予了所有权限,例如 清单中的“ BLUETOOTH_ADMIN”,“ BLUETOOTH”,“ ACCESS_COARSE_LOCATION”,而且我已经在MainActivity中检查了所有权限。 但是我不知道为什么我发现,如果我手动添加“访问我的位置”权限,则“扫描回叫”将开始起作用。 因此,现在在启动服务之前,我将在MainActivity中实现权限请求。 这很奇怪,因为在MainActivity中进行BLE扫描的其他应用程序中,我没有遇到相同的问题;我在MainActivity中扫描的其他应用没有请求此特定权限,它只需要“ BLUETOOTH”和“ BLUETOOTH_ADMIN”权限。 因此,看起来只有在扫描要在后台运行时才需要“访问我的位置”。

((我在Android版本为“ 8.0.0”的设备“ Huawei P8 Lite”中进行了尝试)

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

我已经在一个活动中尝试了“ 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 / BluetoothAdapter:getBluetoothLeScanner

     

D / BluetoothAdapter:isLeEnabled():打开

     

D / BluetoothLeScanner:onScannerRegistered()-status = 0扫描器ID = 7 mScannerId = 0

因此,看来扫描开始正确,但是,如果我尝试调试扫描的回调,它将永远不会到达断点。 有人可以帮我吗?

谢谢:D

0 个答案:

没有答案