2016-11-29 3 views
1

Из-за того, что у меня были проблемы с Bluetooth на Android Lollipop, я попытался изменить метод сканирования.
Итак, я попытался использовать новый пакет. В предыдущей версии я вызвал startScan (mLeScanCallback), и все работает, но теперь, когда я вызываю startScan (mScanCallback), у меня есть ошибка: «D/BluetoothLeScanner: не удалось найти обратную оболочку».
Не найдено ни одного устройства, и ListAdapter, который я использую для отображения устройств, пуст.BluetoothLeScanner не смог найти обратную оболочку

Строки комментариев - это предыдущий код (и он сработал!). Это мой код:

public class Selection extends ListActivity implements ServiceConnection { 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mHandler = new Handler(); 

     // Initializes a Bluetooth adapter through BluetoothManager. 
     final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
     mBluetoothAdapter = bluetoothManager.getAdapter(); 



     getApplicationContext().bindService(new Intent(this, MetaWearBleService.class), this, Context.BIND_AUTO_CREATE); 

} 

private void scanLeDevice(final boolean enable) { 
    final BluetoothLeScanner bluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner(); 

    if (enable) { 

     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 

       //mBluetoothAdapter.stopLeScan(mLeScanCallback); 
       bluetoothLeScanner.stopScan(mScanCallback); 
       setListAdapter(listAdapter); 

      } 
     }, SCAN_PERIOD); 


     //mBluetoothAdapter.startLeScan(mLeScanCallback); 
     bluetoothLeScanner.startScan(mScanCallback); 

    } else { 

     //mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     bluetoothLeScanner.stopScan(mScanCallback); 
     setListAdapter(listAdapter); 

    } 


} 

private ScanCallback mScanCallback = 
     new ScanCallback() { 

      public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 

         listAdapter.addDevice(device); 

        } 
       }); 
      } 
     }; 

Вместо ListAdapter расширяет BaseAdapter и использовать ViewHolder. Если это необходимо, я публикую его.

И что это значит «D/BluetoothLeScanner: не удалось найти обратную оболочку»? Что это неправильно?

В противном случае, как я не могу решить проблему сканирования с помощью Android Lollipop? В Lollipop у меня часто возникают ошибки в отношении BluetoothGatt. Я не знаю, чтобы его минимизировать (или решить).

Благодаря

ответ

5

Бревно сообщение D/BluetoothLeScanner: could not find callback wrapper появляется всякий раз, когда интерфейсы сканирования Bluetooth Android, говорят топ сканирования стоп для приложения, когда они думают, что сканирование не началось. Вы можете увидеть это, посмотрев исходный код Android BluetoothLeScannerhere.

Это, как правило, безопасно игнорировать, поскольку есть много причин, сканируемых моей не было на самом деле начал (он был уже остановлен, Bluetooth выключен, разрешения не получили, и т.д.) клиентское программное обеспечение, которое делает сканирование часто останавливает сканирование по таймеру независимо от того, был ли он успешно запущен или был ли он остановлен вручную до истечения таймера. Примерный код Android (и код, показанный выше) делает именно это, часто вызывая появление этих сообщений журнала.

Если вы действительно хотите свести к минимуму эти сообщения, вам нужно отслеживать, действительно ли началось сканирование, и только прекратить сканирование, если это действительно так. К сожалению, вы не получите код возврата, если сканирование начнется успешно, и вы получите только асинхронный обратный вызов до onScanFailed(errorCode), если вы не можете начать успешно. Таким образом, одним из способов было бы установить scanStartCount++; при вызове сканирования начала и установить scanStartCount--;, когда вы получите обратный вызов до onScanFailed(errorCode). Затем, когда ваш таймер выключается, чтобы остановить сканирование, на самом деле остановите его, если scanStartCount> 0.

Помните, что вы можете свести к минимуму эти сообщения, исходящие из вашего приложения. Другие приложения на телефоне, выполняющие сканирование Bluetooth, могут также вызывать эти сообщения.

0

У меня была такая же проблема с android m.It из-за отсутствия разрешений. Убедитесь, что вы переходите к настройкам и предоставляете разрешение на размещение вашего приложения.

Смежные вопросы