2014-11-20 17 views
6

Tôi hiện đang sử dụng api BLE mới trong phát triển Android.onBatchScanResults không được gọi trong Android BLE

Ý tưởng cơ bản là sử dụng kết quả quét bluetooth để tăng cường recyclerview (danh sách);

Tôi làm theo các BLE guide trên google phát triển

Bây giờ tôi có hai vấn đề: 1. onBatchScanResults người nghe không bao giờ được kích hoạt, nhưng onScanResult hoạt động tốt, là vì các máy quét chỉ cảm nhận 1 cảm biến lân cận?

  1. Máy quét BLE của tôi chậm hơn nhiều so với các ứng dụng khác.

Sau đây là đoạn mã hai chức năng cốt lõi.

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(); 
    }; 

}; 

trong MainFragment là như sau:

beaconsList = new ArrayList<BeaconsInfo>(); 

    mAdapter = new BeaconsAdapter(beaconsList); 
    mRecyclerView.setAdapter(mAdapter); 

    scannBLE(true); 

Trả lời

15

hay không bạn sẽ có được kết quả hàng loạt hoặc kết quả cá nhân phụ thuộc vào các thiết lập quét của bạn.

  1. Để nhận được kết quả lô, bạn cần điều chỉnh ScanSettings. Kiểm tra tài liệu cho số ScanSettings.Builder và thử sử dụng SCAN_MODE_LOW_POWER, để nhóm kết quả. Bạn cũng có thể thử điều chỉnh khoảng thời gian theo lô với setReportDelay(long reportDelayMillis); Bạn có thể xem một bài đăng trên blog mà tôi đã viết về các lợi ích về quyền lực của các cài đặt này here.

  2. Nó không hoàn toàn rõ ràng ý của bạn là "máy quét BLE của tôi chậm hơn nhiều so với các ứng dụng khác", nhưng có thể là giao diện người dùng của ứng dụng chậm bởi vì bạn không cập nhật nó trên chuỗi giao diện người dùng. Hãy thử gói các cuộc gọi của bạn để notifyDatasetChanged như thế này:

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

tôi có cần sử dụng flushPendingScanResults() để nhận kết quả quét theo lô không? – Haven

+1

Không, điều đó chỉ cần thiết nếu bạn muốn nhận hàng sớm. Nếu bạn chỉ cần chờ đợi, bạn sẽ nhận được nó khi hệ điều hành quyết định gửi nó. – davidgyoung

+0

Tôi có câu hỏi cơ bản sau khi đọc blog của bạn, thao tác quét này có chạy trong nền không? hoặc một dịch vụ là cần thiết để thực hiện công việc đó? @davidgyoung – Haven

0

thử setUseHardwareBatchingIfSupported(true). Điều này giải quyết vấn đề cho tôi trên moto360 2nd gen. Tôi nghĩ rằng đây là tự động triển khai cho API mới hơn.

Các vấn đề liên quan