首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android BTLE扫描回调似乎未被调用

android BTLE扫描回调似乎未被调用
EN

Stack Overflow用户
提问于 2020-07-27 20:54:04
回答 2查看 95关注 0票数 0

我想在ViewModel中运行BTLE扫描。我不确定这是不是最好的方法,但这对我来说是一个很好的学习实验。在更简单的设置中运行扫描时,我确实成功列出了我的BT设备。

Manifest中设置BLUETOOTH_ADMINACCESS_COARSE_LOCATION的权限。

我在我的主设置活动中有一个checkPermissions方法,它检查权限,并在需要时请求权限。我还有一个覆盖onRequestPermissionsResult的方法。位置权限显示在我的应用程序的权限中。这些方法或多或少是对开源项目的复制/粘贴(参见this)。

所以,我的扫描仪不能工作。我回调中的日志不会显示在我的日志中。没有错误,我在日志中看到的唯一可疑的东西是:D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=12 mScannerId=0

我的ViewModel看起来像这样:

代码语言:javascript
复制
interface ScanningStatus {
    void setCurrentlyScanning(boolean updatedStatus);
    boolean getCurrentlyScanning();
}


public class SettingsScanningViewModel extends AndroidViewModel {
    private MutableLiveData<ArrayList<BluetoothDevice>> mDeviceList;
    private ArrayList<BluetoothDevice> mInternalDeviceList;
    private MutableLiveData<Boolean> mIsScanning;

    private static final String TAG = "viewmodel";

    private BluetoothManager mBtManager;
    private BluetoothAdapter mBtAdapter;
    private BluetoothLeScanner mBleScanner;
    private static final long SCAN_PERIOD = 5000;


    public SettingsScanningViewModel(Application mApplication) {
        super(mApplication);
        mDeviceList = new MutableLiveData<>();
        mInternalDeviceList = new ArrayList<>();
        mIsScanning = new MutableLiveData<>();

        mBtManager = (BluetoothManager) mApplication.getSystemService(Context.BLUETOOTH_SERVICE);
        mBtAdapter = mBtManager.getAdapter();
        mBleScanner = mBtAdapter.getBluetoothLeScanner();
    }


    MutableLiveData<ArrayList<BluetoothDevice>> getBtDevices() {
        return mDeviceList;
    }


    MutableLiveData<Boolean> getScanningStatus() {
        return mIsScanning;
    }


    private void flushList() {
        mInternalDeviceList.clear();
        mDeviceList.setValue(mInternalDeviceList);
    }


    private void injectIntoList(BluetoothDevice btDevice) {
        mInternalDeviceList.add(btDevice);
        mDeviceList.setValue(mInternalDeviceList);
    }


    private ScanCallback scanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            Log.d(TAG, "in callback");
            BluetoothDevice mDevice = result.getDevice();
            if (!mInternalDeviceList.contains(mDevice) && mDevice.getName() != null) {
                injectIntoList(mDevice);
            }
        }

        @Override
        public void onScanFailed(int errorCode) {
            Log.d(TAG, "onScanFailed: " + errorCode);
        }
    };


    private ScanningStatus scanningStatus = new ScanningStatus() {
        @Override
        public void setCurrentlyScanning(boolean status) {
            mIsScanning.setValue(status);
        }

        public boolean getCurrentlyScanning() {
            return mIsScanning.getValue();
        }
    };


    void doBtScan() {
        Log.d(TAG, "flush list first");
        flushList();
        Log.d(TAG, "starting scan with scanCallback " + scanCallback);
        scanningStatus.setCurrentlyScanning(true);
        mBleScanner.startScan(scanCallback);
        Log.d(TAG, "scan should be running for " + SCAN_PERIOD);

        Handler handler = new Handler();
        handler.postDelayed(() -> {
            mBleScanner.stopScan(scanCallback);
            scanningStatus.setCurrentlyScanning(false);
            }, SCAN_PERIOD);
    }
}

我真的不知道哪里出了问题。是不是因为我在ViewModel中创建了新的BluetoothManagerBluetoothAdapterBluetoothLeScanner,而不是在启动和请求权限的主活动中?如果是这样,我如何重用这些相同的对象?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-07-27 21:01:01

OKKKKKKKKKKKK另一个例子是花了几个小时试图找出问题所在,然后发布,然后2百万之后自己找出来。

看起来ACCESS_COARSE_LOCATION是不够的,需要ACCESS_FINE_LOCATION。所以我想我一定是使用了一个与以前不同的SDK!

谢谢。

票数 0
EN

Stack Overflow用户

发布于 2021-01-30 21:09:48

这三个步骤对我很有效。

应打开

  1. 全球定位系统(如果尚未打开,请编写一些代码将其打开)。

  1. ACCESS_COARSE_LOCATION和ACCESS_FINE_LOCATION权限都应在清单中声明,并在运行时询问。

下面是关于ScanSettings的

  1. 和最重要的回答

https://stackoverflow.com/a/53831870/10432212

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63115770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档