2016-04-27 5 views
0

Ich versuche, in der Nähe befindliche Bluetooth Low-Energy-Geräte in einem Dienst zu erkennen. Wenn der Dienst gestartet wird, wird startLeScan() aufgerufen, und dann wird stopLeScan() nach 10 Sekunden aufgerufen. Obwohl startLeScan() gibt true zurück, und ich habe keine Fehler bekommen, onLeScan auf dem LeScanCallback wurde nicht genannt. der Dienst:Die onLeScan-Funktion wird nicht aufgerufen, wenn versucht wird, BLE-Geräte zu erkennen.

. 
    . 
    . 
      // Device scan callback. 
     private BluetoothAdapter.LeScanCallback mLeScanCallback = 
       new BluetoothAdapter.LeScanCallback() { 

        public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { 
         Log.i(TAG, "New LE Device: " + device.getName() + " @ " + rssi); 
         if (DEVICE_NAME.equals(device.getName()) && deviceAddress.equals(device.getAddress())) { 
          mDevice = device; 
          BleScan(false); 
          connectBluetoothDevice(); 
         } 
        } 
       }; 

    /** 
    * Starts and stops Bluetooth LE scanning for BLE devices. 
    * 
    * @param enable true to start scanning, false to stop scanning. 
    */ 
    public void scanLeDevice(final boolean enable) { 
     if (enable) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        if (mScanning) { 
         BleScan(false); 
        } 
       } 
      }, SCAN_PERIOD); 
      BleScan(true); 
     } else { 
      BleScan(false); 
     } 

    } 

    /** 
    * @param scan true to scan, and false to stop scanning for Bluetooth LE devices. 
    */ 
    private void BleScan(boolean scan) { 
     if (scan) { 
      mScanning = true; 
      boolean temp = mBluetoothAdapter.startLeScan(mLeScanCallback); 
      Log.i(TAG, "Started LE scan: " + temp); 
     } else { 
      mScanning = false; 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     } 
    } 

Ich versuchte BluetoothLeScannerstartScan() und stopScan() und mit ScanCallback anstatt zu verwenden, aber es hat nicht geholfen:

ScanCallback mScanCallback = new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) { 
      Log.i(TAG, "New LE Device: " + result.getDevice().getName() + " @ " + result.getRssi()); 
     } 

     @Override 
     public void onScanFailed(int errorCode) { 
      Log.i(TAG, "Scan Faild!!"); 
     } 
    }; 


    /** 
    * Starts and stops Bluetooth LE scanning for BLE devices. 
    * 
    * @param enable true to start scanning, false to stop scanning. 
    */ 
    public void scanLeDevice(final boolean enable) { 
     if (enable) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        if (mScanning) { 
         BleScan(false); 
        } 
       } 
      }, SCAN_PERIOD); 
      BleScan(true); 
     } else { 
      BleScan(false); 
     } 

    } 

    /** 
    * @param scan true to scan, and false to stop scanning for Bluetooth LE devices. 
    */ 
    private void BleScan(boolean scan) { 
     if (scan) { 
      mScanning = true; 
      mBluetoothLeScanner.startScan(mScanCallback); 
      Log.i(TAG, "Started LE scan"); 
     } else { 
      mScanning = false; 
      mBluetoothLeScanner.stopScan(mScanCallback); 
     } 
    } 

Einige sagen, GPS muss eingeschaltet sein, also habe ich GPS eingeschaltet. Ich habe versucht, das Android-Gerät neu zu starten. Eine andere BLE-Erkennungs-App kann das BLE-Gerät sehen.

Warum wird der Scan-Callback nicht aufgerufen?

bearbeiten

Ich bin mit dieser App auf einem Nexus 5-Gerät Android 6.0.1 laufen.

Ich versuchte Lage Erlaubnis geben, aber es half nicht:

(uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION") 
+0

Können Sie uns sagen, welche Telefon und Android-Version Sie verwenden? Android 6 benötigt eine Standortberechtigung, um Scanergebnisse zu erhalten. – p2pkit

+0

Ich verwende diese App auf einem Nexus 5-Gerät mit Android 6.0.1. Ich habe versucht, eine Standortgenehmigung hinzuzufügen, aber es hat nicht geholfen. –

+0

@AmitaiFesterheim Auf welches SDK zielen Sie ab? Wenn Sie auf> = 23 zielen, müssen Sie explizit auch zur Laufzeit um Erlaubnis bitten. – SJoshi

Antwort

Verwandte Themen