我真的需要了解如何启动服务以便扫描信标,即使应用程序在后台运行,我看了一下我在Github上找到的管理员应用程序,但我无法理解它是如何工作的。有没有人有一段简单的代码向我展示它是如何工作的?
我尝试过的一个简单的解决方案(在网上找到)如下:
public class BeaconRangingService extends Service {
private static final String TAG = BeaconRangingService.class.getSimpleName();
private BeaconManager beaconManager;
@Override
public void onCreate() {
super.onCreate();
beaconManager = BeaconManager.newInstance(getApplicationContext());
beaconManager.setMonitorPeriod(MonitorPeriod.MINIMAL);
beaconManager.setForceScanConfiguration(ForceScanConfiguration.DEFAULT);
beaconManager.registerMonitoringListener(new BeaconManager.MonitoringListener() {
@Override
public void onMonitorStart() {
Log.v(TAG, "start monitoring beacons");
}
@Override
public void onMonitorStop() {
Log.wtf(TAG, "stop monitoring beacons");
}
@Override
public void onBeaconsUpdated(Region region, List<Beacon> list) {
}
@Override
public void onBeaconAppeared(Region region, Beacon beacon) {
Toast.makeText(getApplicationContext(), "Beacon appeared\n BEACON ID: " + beacon.getBeaconUniqueId(), Toast.LENGTH_SHORT).show();
}
@Override
public void onRegionEntered(Region region) {
}
@Override
public void onRegionAbandoned(Region region) {
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v(TAG, "service started");
if (!beaconManager.isBluetoothEnabled()) {
Log.w(TAG, "bluetooth disabled, stop service");
stopSelf();
} else {
connect();
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Log.v(TAG, "service destroyed");
beaconManager.stopMonitoring();
beaconManager.disconnect();
beaconManager = null;
super.onDestroy();
}
private void connectBeaconManager() {
try {
beaconManager.connect(new OnServiceBoundListener() {
@Override
public void onServiceBound() {
try {
HashSet<Region> regions = new HashSet<>();
regions.add(Region.EVERYWHERE);
beaconManager.startMonitoring(regions);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
} catch (RemoteException e) {
throw new IllegalStateException(e);
}
}
}
但我无法让它发挥作用
答案 0 :(得分:6)
我假设你一直在测试kontakt-beacon-admin-sample-app - 前景/背景展示。该机制非常简单,但需要了解如何在Android中拦截广播。
首先,BeaconManager负责通过回调方式通知BLE远程设备。
其次,BeaconManager是在后台服务中故意配置和控制的,因为服务充当广播生成器。该服务的主要优点是即使用户放弃应用程序也能正常工作。 所以实际上,服务部门盲目地发送广播,希望有人会拦截广播。
第三,请求发送在以下行中执行:
sendOrderedBroadcast(intent, null);
sendOrderedBroadcast() is documented here.
第四,现在是时候拦截广播了。然后我们配置2个广播接收器:BackgroundScanReceiver和ForegroundScanReceiver。
当拦截扫描广播时,BackgroundScanReceiver会显示通知。
ForegroundScanReceiver只显示祝酒词,但可以根据需要进行更改。
此时有一个技巧,我们指定截取广播的顺序。我们将ForegroundScanReceiver配置为拦截第一顺序中的任何广播。 我们通过在Intent过滤器中设置优先级来设置我们在onResume()中动态注册的Receiver(see SCAN_INTENT_FILTER)(应用程序变为可见)和onPause()(应用程序变得部分可见)。我们还静态配置BackgroundBroadcastReceiver和give it the priority with value 1。
切换前景/背景
我们现在已确定优先级,并且我们知道ForegroundScanReceiver首先拦截广播,因为它具有更高的优先级。
当应用程序处于前台时,两个扫描接收器(前景和后台)都被注册,但只有前一个接收广播并阻止每个广播被后台拦截。它是done by the following method - abortBroadcast()(注意Foreground和Background接收器扩展了常见的抽象):
abortBroadcast();
然而,当应用程序隐藏在后台时,ForegroundScanReceiver将取消注册(see onPause() method),因此原始接收器就是BackgroundScanReceiver。
You can find the documentation about abortBroadcast() here.
为什么kontakt.io Proximity SDK中不包含此功能?
kontakt-beacon-admin-sample-app中提出的方法可以通过不同的方式解决,而kontakt.io移动SDK的目标是不向您提供已经实现的所有功能,因为这会产生一些限制适用于您应用的SDK。目标是为您提供基础知识,并提供SDK组件使用方面的灵活性。 kontakt-beacon-admin-sample-app证明了我们的SDK与一些不同的Android组件协作可以为您提供您期望的功能,最重要的是,为您提供您想要做的灵活性
我建议观察kontakt-beacon-admin-sample-app,因为这是第一个将kontakt.io SDK与其他开源库和核心Android SDK集成的不同方法首先引入的项目。
一旦您希望SDK按照您的期望行事,我也强烈建议您提出问题。
我希望我对你的问题作了一些澄清。
答案 1 :(得分:3)
如果您愿意尝试使用免费和开源Android Beacon Library,那么您可以尝试启动应用程序并在后台发现信标时发送通知。它可以在这里找到:
https://github.com/AltBeacon/android-beacon-library-reference
您可以通过添加如here.所述的Beacon Parser
来使用Kontakt.io信标。此参考应用程序的工作原理是自动启动BeaconService
以在手机开机时扫描信标。此服务在后台使用RegionBootstrap
类,该类用于自定义AndroidApplication
类here(您可以自定义)。这堂课&#39;首次发现信标时会调用didEnterRegion
方法,允许您启动Activity
(该示例在首次检测时执行)或发送通知(示例在后续通知中执行此操作。)