我正在使用Altbeacon库并实现前台服务以实现更快的测距。我的应用程序旨在在范围内匹配信标时向用户发送通知。目标是无论如何,手机锁定,解锁,应用程序打开,应用程序关闭以及从任务管理器清除应用程序,都将发生这种情况。
该应用程序可以在运行Android 8.0的Samsung Galaxy s7上正常运行。我在运行Android 8.0的Samsung Galaxy s9上遇到的问题是按下电源按钮以锁定手机。手机不再像以前那样应该经常接收通知,就像前台信标扫描被阻止一样。
发送信标的设备可以以25毫秒的速率连续发送新信标12秒钟,出于测试目的,设置为在12秒钟结束时重复该过程。用户应该每12秒接收一次新的通知,但是s9可能只收到1条通知,然后可能会错过5条通知。 s7将按预期接收每个通知。
将背景扫描速率设置为扫描1.1秒,然后等待10秒。我希望我可以提供有关该问题的日志,但是当电话插入时不会发生该问题,因此我无法确切指出为什么s9不会以这种方式表现s9的原因。我认为它一定是打do睡模式或睡眠模式,因为插入电源线后,s9会按预期接收所有通知。那是我能够测试的仅有的两部手机,所以我不知道s8是否也有问题。
由电源按钮锁定时,可能导致s9的范围与s7不同吗?如果电话只是自己进入睡眠状态,则其作用与按电源按钮使其进入睡眠状态相同。下面的代码段。
谢谢!
mBeaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext());
set_forground_notification(true);
logManager.setLogger(Loggers.verboseLogger());
logManager.setVerboseLoggingEnabled(true);
mBeaconManager.setAndroidLScanningDisabled(false); // Setting to false allows low latency scanning
mBeaconManager.setRegionStatePersistenceEnabled(false);
mBeaconManager.setBackgroundScanPeriod(1100);
mBeaconManager.setForegroundScanPeriod(1100);
mBeaconManager.setForegroundBetweenScanPeriod(2000);
mBeaconManager.setBackgroundBetweenScanPeriod(10000);
mBeaconManager.setBackgroundMode(true); // this is being set to true here so that on app termination
// or reboot when the app starts back up because of the service, the scanning period
// is set to background and not foreground
private void set_forground_notification(boolean post)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (post) {
String CHANNEL_ID = "Scanning_for_device";
CharSequence name = "Scanning_for_device";
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, android.app.NotificationManager.IMPORTANCE_HIGH);
mChannel.setShowBadge(false);
mChannel.setSound(null,null);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_foreground_logo)
.setContentTitle("Scanning for Device")
.setSound(null)
.setOnlyAlertOnce(true);
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(pendingIntent);
android.app.NotificationManager mNotificationManager =
(android.app.NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.createNotificationChannel(mChannel);
// sends foreground notification and starts foreground scanning?
mBeaconManager.enableForegroundServiceScanning(mBuilder.build(), 457);
} else {
// removes foreground notification and stops foreground scanning?
mBeaconManager.disableForegroundServiceScanning();
}
}
}