2016-06-07 5 views
2

У меня возникли проблемы с подключением Bluetooth для сканирования устройств с помощью Samsung Galaxy s5.BluetoothLescan() не находит никаких устройств

Я на Android 6.0 и настроить разрешения на мое приложение для сканирования, так как:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
      // Android M Permission check 
      if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setTitle("This app needs location access"); 
       builder.setMessage("Please grant location access so this app can devices."); 
       builder.setPositiveButton(android.R.string.ok, null); 
       builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 

        public void onDismiss(DialogInterface dialog) { 
         requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); 
        } 
       }); 

       builder.show(); 
      } 

Я предполагаю, что это работает правильно, потому что я получил всплывающий просить разрешения, которые я принял.

Моя функция сканирования:

private void scanLeDevice(final boolean enable) { 
     if (enable) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        mScanning = false; 
        Log.i("start" , "Stopping scan..."); 
        mBluetoothLeScanner.stopScan(mScanCallback); 
       } 
      }, SCAN_PERIOD); 

      mScanning = true; 
      Log.i("start" , "Starting scan..."); 
      mBluetoothLeScanner.startScan(mScanCallback); 
     } else { 
      mScanning = false; 
      mBluetoothLeScanner.stopScan(mScanCallback); 
     } 

    } 

Теперь он останавливается и начинает сканирование правильно, так как Logcat дает мне журналы. Но это просто не находит никаких устройств, которые действительно странны, потому что я сижу рядом со своим ноутбуком и вторым телефоном с поддержкой Bluetooth.

Вот мой обратный вызов, кстати, если кому-то интересно:

Private ScanCallback mScanCallback = new ScanCallback() { 

    @Override 
    public void onScanResult(int callbackType, ScanResult result) { 
     System.out.println("BLE// onScanResult"); 
     Log.i("callbackType", String.valueOf(callbackType)); 
     Log.i("result", result.toString()); 
     BluetoothDevice btDevice = result.getDevice(); 
    } 

    @Override 
    public void onBatchScanResults(List<ScanResult> results) { 
     System.out.println("BLE// onBatchScanResults"); 
     for (ScanResult sr : results) { 
      Log.i("ScanResult - Results", sr.toString()); 
     } 
    } 

    @Override 
    public void onScanFailed(int errorCode) { 
     System.out.println("BLE// onScanFailed"); 
     Log.e("Scan Failed", "Error Code: " + errorCode); 
    } 
}; 

Теперь, как вы можете видеть, сканирование не подведет, так как Logcat не дает мне журнал о сканировании не удалось, но apperantly его также не найти любые устройства ...

Logcat:

06-07 17:13:02.622 16802-16802/com.example.joey.findmycar I/start: Starting scan... 
06-07 17:13:02.802 16802-16802/com.example.joey.findmycar W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView) 
06-07 17:13:02.882 16802-16802/com.example.joey.findmycar I/Timeline: Timeline: Activity_idle id: [email protected] time:699666571 
06-07 17:13:14.632 16802-16802/com.example.joey.findmycar I/start: Stopping scan... 

Я добавил необходимые разрешения на мой манифест:

Я пробовал почти все возможности, и я начинаю думать, что Bluetooth на моем телефоне может как-то сломаться, что странно, потому что я могу вручную обнаруживать и подключаться к устройствам в настройках Android.

+0

так как вы попробовали на Android 6, вы пробовали давать разрешение местоположения, а также, как и от Android 6 года место должно быть включено в то время как просмотрит BLE устройства.Таким образом, вам также нужно запросить разрешение на выполнение для местоположения. – Gautam

+0

Убедитесь, что службы определения местоположения также включены (Настройки> Местоположение> Вкл.), Как если бы это было отключено, вы не получите никаких результатов сканирования, даже если у вас есть разрешение на размещение ». – kcoppock

+0

Похоже, у вас установлен тайм-аут примерно на 10 секунд, верно? Что произойдет, если вы просто отпустите его, пока не будет вызван один из обратных вызовов? –

ответ

2

Ваш код должен работать нормально, если вы сканируете устройства BLE, такие как монитор сердечного ритма или датчик приближения. Проблема может заключаться в том, что с помощью этого кода ваше приложение является клиентом GATT и ищет сервер GATT.

Так что, если вы хотите подключиться к другому телефону вы могли бы написать приложение сервера ГАТТ и запустить его на другой телефон (как это указано в последнем абзаце here)

2

Я нашел это в Android 6.0 Apis updates:

Улучшенная Bluetooth Low Energy Сканирование

Если ваше приложение выполняет выполняет сканирование Bluetooth Low Energy, используйте новый setCallbackType() метод, чтобы указать, что вы хотите система уведомляет обратные вызовы, когда она впервые находит или видит через долгое время рекламный пакет, соответствующий установленному ScanFilter. Такой подход к сканированию более энергоэффективен, чем тот, который представлен в предыдущей версии платформы.