Android 无法在后台扫描

Android 无法在后台扫描,android,altbeacon,beacon,eddystone,Android,Altbeacon,Beacon,Eddystone,这是应该根据altbeacon页面中的示例代码进行后台扫描的代码,但这不会发生,我甚至没有得到Did enter region标记RangingActivity,它实现信标消费者范围信标,没有任何问题。我看到的唯一日志是背景扫描启动当我第一次启动应用程序时。提前谢谢 public class BackgroundScanner extends Application implements BootstrapNotifier { private String TAG="Background Sca

这是应该根据altbeacon页面中的示例代码进行后台扫描的代码,但这不会发生,我甚至没有得到Did enter region标记RangingActivity,它实现信标消费者范围信标,没有任何问题。我看到的唯一日志是背景扫描启动当我第一次启动应用程序时。提前谢谢

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) {

}

图书馆可能认为它已经在该地区。从2.8版开始,该库在应用程序重新启动时跟踪区域状态,以防止多个
didEnterRegion
回调。您可以通过关闭附近的所有信标(或关闭蓝牙)来测试这一点,直到收到
didExitRegion
回调。然后再打开它们,看看是否有
didEnterRegion
回调。

库可能认为它已经在该区域中。从2.8版开始,该库在应用程序重新启动时跟踪区域状态,以防止多个
didEnterRegion
回调。您可以通过关闭附近的所有信标(或关闭蓝牙)来测试这一点,直到收到
didExitRegion
回调。然后再打开它们,看看是否有
didEnterRegion
回调。

最好将此类后台任务放在android服务中,而不是应用程序中。@PetrovDmitrii我想先这样做,但后来发现此库已经提供了服务。最好将此类后台任务放在android服务中,不是在应用程序中。@Petrovdmitri我想先这样做,但后来我发现这个库已经提供了服务。谢谢。这似乎是我面临的问题。你不是第一个遇到这个问题的人。你认为有没有更直观的方法呢?既然你提到了这个问题,这样做很有意义。谢谢。这似乎是我面临的问题。你不是第一个遇到这个问题的人。你认为有没有更直观的方法呢?既然你提到了这个问题,这种方法就很有意义了。