2015-12-06 51 views
2

我試圖在Android中檢測帶有Android Beacon Library的信標。我創建了一個在後臺運行並檢測信標的服務。Android信標庫 - BLE信標檢測不起作用

問題是,應用程序沒有檢測到藍牙關閉時的信標。但是,如果我打開藍牙工作正常。還有一件很奇怪的事情。如果我在應用程序運行時再次關閉藍牙,它仍會繼續檢測。這意味着BLE檢測正在工作,但僅在打開藍牙並再次關閉藍牙時纔有效。

如何啓用BLE檢測?下面是我的實現。我想念什麼?

燈塔服務類

public class BeaconDiscoverer extends Service implements BeaconConsumer { 
    private static final String TAG = BeaconDiscoverer.class.getSimpleName(); 
    private static BeaconManager beaconManager; 
    private static Region region; 
    private BackgroundPowerSaver backgroundPowerSaver; 

    public BeaconDiscoverer() { 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     region = new Region("myRangingUniqueId", null, null, null); 
     beaconManager = BeaconManager.getInstanceForApplication(this); 

     beaconManager.getBeaconParsers().add(new BeaconParser(). 
       setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 

     configureBatterySaverMode(); 

     beaconManager.bind(this); 
    } 

    @Override 
    public void onDestroy() { 
     beaconManager.unbind(this); 
     super.onDestroy(); 
    } 

    private void configureBatterySaverMode() { 
     BeaconManager.setAndroidLScanningDisabled(true); 
     backgroundPowerSaver = new BackgroundPowerSaver(getApplicationContext()); 

     // set the duration of the scan to be 5 seconds 
     beaconManager.setBackgroundScanPeriod(Utility.convertToMilliseconds(2)); 
     // set the time between each scan to be 1 min (60 seconds) 
     beaconManager.setBackgroundBetweenScanPeriod(Utility.convertToMilliseconds(25)); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.d(TAG, "BeaconDiscoverer started up"); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
     Log.d(TAG, "onBeaconServiceConnect"); 
     beaconManager.setRangeNotifier(new RangeNotifier() { 
      @Override 
      public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
       if (beacons.size() > 0) { 
        Beacon firstBeacon = beacons.iterator().next(); 
        Log.i(TAG, "Beacon detected: " + firstBeacon.getDistance() + " m. - " + firstBeacon.getBluetoothAddress()); 

       } 
      } 
     }); 

     startRanging(); 
    } 

    public void stopRanging() { 
     try { 
      beaconManager.stopRangingBeaconsInRegion(region); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void startRanging() { 
     if (User.currentUser() == null) 
      return; 

     try { 
      beaconManager.startRangingBeaconsInRegion(region); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

應用類

public class App extends Application { 
    private static final String TAG = App.class.getSimpleName(); 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     startService(new Intent(this, BeaconDiscoverer.class)); 
    } 
} 
+0

你想達到什麼目前還不清楚。 –

+0

我想在藍牙未關閉時檢測信標。我的意思是如果用戶至少沒有打開藍牙一次,可以檢測不起作用。 – sembozdemir

回答

3

答案很簡單:你必須啓用藍牙檢測信標與庫。信標使用藍牙LE來宣傳他們的存在,並且藍牙無線電必須開啓才能聽到信號。

我無法解釋爲什麼在關閉藍牙後繼續檢測信標。一種可能性是你只是在內存緩存中看到它們在圖書館短暫的掃描週期內消失之前。另一種可能性是,Android設備在關閉時表示藍牙關閉,但它並非真的關閉。

典型的方法是檢測應用程序啓動時藍牙是否關閉,並提示用戶打開它。在參考應用程序中有here的示例代碼。

+0

噢,謝謝,我認爲我們不需要在棒棒糖設備檢測到信標後啓用藍牙。我只是因爲手機在關閉藍牙後檢測到信標而感到困惑。無論如何,我還實施了警告用戶打開藍牙。謝謝。 – sembozdemir

0
private void registerBoradcastReceiver() { 
    IntentFilter stateChangeFilter = new IntentFilter(
      BluetoothAdapter.ACTION_STATE_CHANGED); 
    IntentFilter connectedFilter = new IntentFilter(
      BluetoothDevice.ACTION_ACL_CONNECTED); 
//IntentFilter connectedFilter = new IntentFilter(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); 
    IntentFilter disConnectedFilter = new IntentFilter(
      BluetoothDevice.ACTION_ACL_DISCONNECTED); 
    registerReceiver(stateChangeReceiver, stateChangeFilter); 
    registerReceiver(stateChangeReceiver, connectedFilter); 
    registerReceiver(stateChangeReceiver, disConnectedFilter); 
} 

    private BroadcastReceiver stateChangeReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (BluetoothDevice.ACTION_ACL_CONNECTED == action) { 
      startService; 
     } 
     if (BluetoothDevice.ACTION_ACL_DISCONNECTED == action) { 
      stopService; 
     } 
     if (BluetoothAdapter.ACTION_STATE_CHANGED == action) { 

     } 
    } 
}; 
+0

你能提供一些解釋嗎? – sembozdemir

+0

接收藍牙廣播。 –