我真的需要了解如何启动一项服务,以便扫描信标,即使应用程序是在后台运行的,我看了一下我在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);
}
}
} 但我不能让它起作用
发布于 2015-05-26 11:50:41
我想你已经在测试kontakt-信标-管理-样本-应用程序 -前台/背景展示了。该机制非常简单,但需要对如何在Android中截获广播进行一些了解。
让我们分析一下BackgroundScanService
在中,BeaconManager负责通过回调方法通知BLE远程设备的存在。
其次是,在后台服务中故意配置和控制BeaconManager,因为服务充当广播生成器。该服务的主要优点是,即使用户放弃了应用程序,它也可以工作。因此,实际上,广播服务局盲目地发送广播,希望有人能拦截它。
第三次,请求发送在以下行中执行:
sendOrderedBroadcast(intent, null);这里记录了sendOrderedBroadcast()。
第四,现在是拦截广播的时候了。然后我们配置两个广播接收器来实现这一点:BackgroundScanReceiver和ForegroundScanReceiver。
BackgroundScanReceiver在截获扫描广播时显示通知。
ForegroundScanReceiver简单地显示祝酒词,但这可以根据个人的需要进行更改。
在这一点上,有一个技巧,我们指定应以何种顺序拦截广播。我们将ForegroundScanReceiver配置为以一阶截获任何广播。我们通过设置与接收方(过滤器)绑定的意图筛选器(过滤器)中的优先级,动态地在onResume() (应用程序变得可见)和onPause() (应用程序部分可见)中注册。我们还静态地配置了BackgroundBroadcastReceiver和给它以值1的优先级。
交换前景/背景
我们现在已经确定了优先级,并且我们知道ForegroundScanReceiver首先拦截广播,因为它具有更高的优先级。
当应用程序在前台时,两个扫描接收器(前景和背景)都被注册,但只有前景接收器拦截广播,并防止每个广播被背景广播截获。它是由以下方法完成- abortBroadcast() (请注意,前台和后台接收器扩展了公共抽象):
abortBroadcast();然而,当应用程序隐藏在背景中时,则ForegroundScanReceiver未注册(参见onPause()方法),因此原始接收方是BackgroundScanReceiver。
您可以在这里找到关于abortBroadcast()的文档。
为什么这个特性没有包含在kontakt.io邻近SDK中?
kontakt-信标-管理-样本-应用程序中提出的方法可以通过不同的方式解决,而kontakt.io移动SDK的目标是不为您提供已经实现的所有功能,因为这带来了将SDK与应用程序相结合的一些限制。目标是为您提供基本知识,并在SDK组件使用方面提供灵活性。kontakt-信标-管理-样本-应用程序是一个概念的证明,即我们的SDK与一些不同的安卓组件合作可以为您提供您期望的功能,最重要的是给您提供您想要做的事情的灵活性。
我建议观察kontakt-信标-管理-样本-应用程序,因为这是第一个将kontakt.io SDK与其他开源库和核心Android集成的不同方法的项目。
我还强烈鼓励您提出一个问题,一旦您希望SDK按照您的期望行事。
我希望我对你的问题作了一些澄清。
发布于 2015-05-25 22:56:07
如果您愿意尝试免费的开源Android灯塔图书馆,那么您可以尝试使用一个现成的参考应用程序来启动该应用程序,并在后台发现信标时发送通知。这里可以买到:
https://github.com/AltBeacon/android-beacon-library-reference
您可以通过添加一个灯塔分析器(如所描述的Kontakt.io )来使用这里。信标。
这个参考应用程序的工作原理是自动启动一个BeaconService来扫描手机上的信标。此服务在后台使用RegionBootstrap类,该类用于自定义AndroidApplication类这里 (您可以自定义该类)。这个类的didEnterRegion方法在首次发现信标时被调用,允许您启动一个Activity (该示例在第一次检测时这样做)或发送一个通知(该示例在随后的通知中这样做)。
关于这一切如何与 这里 和 这里。一起工作的更多文档
https://stackoverflow.com/questions/30433888
复制相似问题