Java Android中未调用onBatchScanResults

Java Android中未调用onBatchScanResults,java,android,callback,bluetooth-lowenergy,ibeacon,Java,Android,Callback,Bluetooth Lowenergy,Ibeacon,我现在正在android开发中使用新的BLEAPI 基本思想是使用蓝牙扫描结果来膨胀recyclerview(列表) 我遵循了谷歌开发者的建议 现在我有两个问题: 1. onBatchScanResultslistener从未被触发,但onScanResult工作正常,这是因为扫描仪仅检测到附近的一个传感器吗 与其他应用程序相比,我的BLE扫描仪要慢得多 下面是两个核心函数的代码片段 private void scanBLE(boolean enable) { final Bluetoo

我现在正在android开发中使用新的BLEAPI

基本思想是使用蓝牙扫描结果来膨胀recyclerview(列表)

我遵循了谷歌开发者的建议

现在我有两个问题: 1.
onBatchScanResults
listener从未被触发,但
onScanResult
工作正常,这是因为扫描仪仅检测到附近的一个传感器吗

  • 与其他应用程序相比,我的BLE扫描仪要慢得多
  • 下面是两个核心函数的代码片段

    private void scanBLE(boolean enable) {
        final BluetoothLeScanner mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
        if (enable) {
            mScanning = true;
            mBluetoothLeScanner.startScan(mScanCallback);        
        } else {
            if (mScanning) {
                mScanning = false;
                mBluetoothLeScanner.stopScan(mScanCallback);
            }
        }
    
        Log.i(TAG, "now the scanning state is" + mScanning);
    }
    
    // Device scan callback.
    private ScanCallback mScanCallback =
            new ScanCallback() {
        public void onScanResult(int callbackType, android.bluetooth.le.ScanResult result) {
            addBeaconTolist(result, beaconsList);
            mAdapter.notifyDataSetChanged();
        };
    
        public void onScanFailed(int errorCode) {
            Log.i(TAG, "error code is:" + errorCode);
        };
    
        public void onBatchScanResults(java.util.List<android.bluetooth.le.ScanResult> results) {
            Log.i(TAG, "event linstener is called!!!!");
            Log.i(TAG, "batch result are:" + results);
            beaconsList.clear();
            for (int i = 0; i < results.size(); i++) {
                ScanResult result = results.get(i);
                addBeaconTolist(result, beaconsList);
            }
            mAdapter.notifyDataSetChanged();
        };
    
    };
    
    private void可扫描(布尔启用){
    最终BluetoothLeScanner mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();
    如果(启用){
    mScanning=true;
    mbluetotherlescanner.startScan(mScanCallback);
    }否则{
    如果(扫描){
    mScanning=false;
    mBluetoothLeScanner.stopScan(mScanCallback);
    }
    }
    Log.i(标记“现在扫描状态为”+mScanning);
    }
    //设备扫描回调。
    专用扫描回调mScanCallback=
    新ScanCallback(){
    public void onScanResult(int callbackType,android.bluetooth.le.ScanResult){
    添加BeaContoList(结果,BeaConList);
    mAdapter.notifyDataSetChanged();
    };
    公共无效OnScan失败(内部错误代码){
    Log.i(标签,“错误代码为:”+errorCode);
    };
    public void onBatchScanResults(java.util.List结果){
    Log.i(标记“调用事件linstener!!!!”);
    Log.i(标记“批次结果为:+结果”);
    beaconList.clear();
    对于(int i=0;i
    在main中,片段如下所示:

        beaconsList = new ArrayList<BeaconsInfo>();
    
        mAdapter = new BeaconsAdapter(beaconsList);
        mRecyclerView.setAdapter(mAdapter);
    
        scannBLE(true);
    
    beaconlist=newarraylist();
    mAdapter=新BeaconsAdapter(beaconsList);
    mRecyclerView.setAdapter(mAdapter);
    斯坎恩布尔(真);
    
    是否获得批处理结果或单个结果取决于扫描设置

  • 为了获得批处理结果,您需要调整
    ScanSettings
    。请查看文档中的,然后尝试使用
    扫描模式\u低功率
    ,这将成批显示结果。您还可以尝试使用
    setReportDelay(long reportDelayMillis)
    调整批处理间隔;你可以看到我写的一篇关于这些设置的强大优势的博文

  • 现在还不完全清楚你所说的“我的BLE扫描仪比其他应用程序慢得多”是什么意思,但可能是应用程序的UI滞后,因为你没有在UI线程上更新它。尝试将呼叫包装为notifyDatasetChanged,如下所示:

    runOnUiThread(new Runnable() {
      @Override
      public void run() {
         mAdapter.notifyDataSetChanged();
      }
    });
    

  • 请尝试
    setUseHardwareBatchingSupported(true)
    。这为我在moto360第二代上解决了这个问题。我认为这是为更新的API自动实现的

    我是否需要使用flushPendingScanResults()来获取批扫描结果?不,仅当您希望尽早获取批时才需要。如果你只是等待,当操作系统决定发送它时,你会得到它。读了你的博客后,我有一个基本问题,这个扫描是否在后台运行?还是需要一项服务来完成这项工作@Davidgyoung在我在博客中描述的案例中,是的,Android Beacon库在服务中后台运行扫描。谢谢,每次我设置扫描设置的reportDelay时,我的nexus5应用程序都会出现一个扫描失败的功能,这似乎是API的问题?