2016-05-26 5 views
1

Это код, который предполагается для фонового сканирования в соответствии с образцом кода на странице altbeacon, но этого не происходит, я даже не получаю . Введите регион тег. RangingActivity, который реализует маяки BeaconConsumer без каких-либо проблем. Единственный журнал, который я вижу, - Начато сканирование в фоновом режиме!, когда я запускаю приложение в первый раз. Заранее спасибо.Не удается выполнить сканирование в фоновом режиме

public class BackgroundScanner extends Application implements BootstrapNotifier { 
private String TAG="Background Scanner"; 
private RegionBootstrap regionBootstrap; 
private BackgroundPowerSaver backgroundPowerSaver; 
private boolean haveDetectedBeaconsSinceBoot = false; 
private RangingActivity rangingActivity; 
@Override 
public void onCreate() { 
    Log.d(TAG,"Background Scanning Initiated!"); 
    super.onCreate(); 
    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this); 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19")); 
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_URL_LAYOUT)); 
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); 

    Region region = new Region("backgroundRegion", 
      null, null, null); 
    beaconManager.setBackgroundBetweenScanPeriod(60000L); 
    try { 
     beaconManager.updateScanPeriods(); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
    regionBootstrap = new RegionBootstrap(this, region); 
    backgroundPowerSaver = new BackgroundPowerSaver(this); 

} 

@Override 
public void didEnterRegion(Region region) { 
    Log.d(TAG, "did enter region."); 
    sendNotification(); 
} 
@SuppressLint("NewApi") 
private void sendNotification() { 
    NotificationCompat.Builder builder = 
      new NotificationCompat.Builder(this) 
        .setContentTitle("Notification!") 
        .setContentText("Beacon Nearby!") 
        .setSmallIcon(R.mipmap.ic_launcher); 

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
    stackBuilder.addNextIntent(new Intent(this, RangingActivity.class)); 
    PendingIntent resultPendingIntent = 
      stackBuilder.getPendingIntent(
        0, 
        PendingIntent.FLAG_UPDATE_CURRENT 
      ); 
    builder.setContentIntent(resultPendingIntent); 
    NotificationManager notificationManager = 
      (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(1, builder.build()); 
} 

@Override 
public void didExitRegion(Region region) { 

} 

@Override 
public void didDetermineStateForRegion(int i, Region region) { 

} 
+0

Лучше поставить такую ​​фоновую задачу в службе Android, а не в приложении. –

+0

@PetrovDmitrii Я хотел сделать это первым, но потом я узнал, что эта библиотека уже предоставляет услугу. –

ответ

0

Библиотека может подумать, что она уже в регионе. Начиная с версии 2.8, библиотека отслеживает состояние региона через перезагрузки приложений, чтобы предотвратить множественные обратные вызовы didEnterRegion. Вы можете проверить это, отключив все маяки поблизости (или выключив Bluetooth), пока не получите обратный вызов didExitRegion. Затем верните их обратно и посмотрите, получится ли обратный вызов didEnterRegion.

+0

Спасибо. Кажется, это проблема, с которой я столкнулся. –

+0

Вы не первый, кто столкнулся с этой проблемой. Считаете ли вы, что это может быть более интуитивно понятным? – davidgyoung

+0

Теперь, когда вы упоминаете проблему, это так хорошо. –