2016-09-22 17 views
9

Tôi đang phát triển một ứng dụng mà tôi có thể tìm và định cấu hình thiết bị BLE. Tôi đang sử dụng API BLE Android chuẩn, nhưng gần đây tôi đã gặp phải một số sự cố lạ.Android ngừng tìm thiết bị BLE: onClientRegistered() - status = 133 clientIf = 0

Khi tôi bật ứng dụng, quét BLE hoạt động OK. Tôi đang quét sử dụng:

mBluetoothAdapter.startLeScan(mLeScanCallback); // for Kitkat and below 

mBluetoothAdapter.getBluetoothLeScanner().startScan(mScanCallback); // for Lollipop and above 

Trong Logcat Tôi nhận được thông điệp sau đây (tôi đoán đây là quan trọng đối với vấn đề này):

D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 

Trong ứng dụng tôi của tôi cũng có thể đọc các đặc điểm nhất định từ các thiết bị BLE của tôi (ví dụ: trạng thái pin). Tôi kết nối với thiết bị để đọc đặc điểm này trong một đoạn riêng biệt bằng cách sử dụng:

mBluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE); 
mBluetoothAdapter = mBluetoothManager.getAdapter(); 
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(mMacAddress); 
mBluetoothGatt = mBluetoothDevice.connectGatt(mContext, false, mGattCallback); 

Các đặc điểm này được đọc chính xác. Trong onCharacteristicRead callback Tôi cũng ngắt kết nối và gần Gatt:

mBluetoothGatt.disconnect(); 
mBluetoothGatt.close(); 

Mỗi lần tôi mở một đoạn để đọc một đặc tính (dù cho dù đó là cùng một thiết bị hay không) clientIf giá trị gia tăng. Tôi có thể nhìn thấy trong LogCat:

D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=8 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=9 
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=10 

Tất cả mọi thứ hoạt động tốt cho đến khi giá trị clientIf bằng 10. quét BLE dừng việc tìm kiếm bất kỳ thiết bị, tôi không thể kết nối với bất kỳ thiết bị của tôi để đọc bất kỳ đặc điểm vv Và LogCat hiển thị vô hạn những thông báo này:

D/BluetoothGatt: unregisterApp() - mClientIf=0 
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0 

Cách duy nhất để khắc phục là hủy ứng dụng và khởi chạy lại hoặc khởi động lại Bluetooth bằng cách tắt và bật thủ công. Tôi đã gặp sự cố này chỉ trên một số thiết bị nhất định như Xperia Z1 (Android KitKat) và Galaxy S4 (Android Lollipop). Tôi không thể tạo lại vấn đề này trên Xperia Z3 Compact chạy Android Marshmallow ...

Tôi có thể làm được gì không? Tôi đã thử nhiều "giải pháp" như - gọi tất cả các phương thức BLE từ chuỗi giao diện người dùng và đóng/ngắt kết nối GATT, nhưng không có gì hữu ích. Làm thế nào tôi có thể sửa chữa nó?

Trả lời

8

Tôi sẽ trả lời câu hỏi của riêng mình, bởi vì có thể nó sẽ giúp ai đó có cùng một vấn đề.

Trước hết, tôi không thể khắc phục sự cố xảy ra lỗi Bluetooth sau khi giá trị mClientIf đạt được 10. Tuy nhiên tôi tìm thấy một cách giải quyết giúp trong trường hợp của tôi.

Mặc dù tôi đã dừng tìm kiếm đèn hiệu trong Fragment và đặc điểm bắt đầu đọc khác, BLE API dường như không dừng tìm kiếm ngay lập tức và sau khi mở Fragment hệ thống tiếp theo.

Đây là lý do tại sao tôi cần phải chờ một thời gian sau khi rời khỏi Fragment đầu tiên và trước khi bắt đầu đọc đặc tính trong một khác.

Phương pháp này được gọi là trong onCreateView của "mới" Fragment (sử dụng postDelayed giúp tôi giải quyết vấn đề):

private void getBatteryCharacteristic() { 
     new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mBeaconBatteryStateReader = new BeaconBatteryStateReader(
         BeaconDetailsActivity.this, 
         mBeacon.getMacAddress()); 
       mBeaconBatteryStateReader.readBatteryState(BeaconDetailsActivity.this); 
      } 
     }, 100); 
    } 
+1

Tôi đã có một vấn đề tương tự và cho tôi thêm một sự chậm trễ nhỏ giữa ngắt kết nối và quét giải quyết vấn đề quá. Cảm ơn! – Tijn

+0

Tôi đã tìm ra giải pháp tương tự như bạn. Chi tiết: https://github.com/googlesamples/android-BluetoothLeGatt/issues/44 –

0

Đóng đối tượng gatt là cách chính xác để giải phóng tài nguyên. Nếu nó vẫn không hoạt động có một lỗi trong Android trên điện thoại cụ thể đó.

Để giảm thiểu cơ hội đạt đến giới hạn, bạn có thể đảm bảo rằng bạn không bao giờ có nhiều hơn một đối tượng gatt trên mỗi thiết bị.

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