我正在使用altbeacon参考应用程序来处理信标。当我尝试打印arg0时我得到了空值,我在监视信标时得到了空值。
@Override
public void didEnterRegion(Region arg0) {
// In this example, this class sends a notification to the user
whenever a Beacon
// matching a Region (defined above) are first seen.
System.out.println(arg0);
System.out.println(arg0.getUniqueId());
System.out.println(arg0.getId1());
Log.d(TAG, "did enter region.");
}
我如何在这里获取UUID?是否有必要在这里调用测距服务,因为我正在尝试提供前台服务,并且如果我每次遇到didEnter事件时都调用测距服务,它会很沉重并被android系统杀死。 我以前曾尝试这样做,并将结果存储在集合中,然后查看该区域是否有新信标,然后将其添加到该区域,但导致服务被杀死。
修改:我尝试了以下
@Override
public void didEnterRegion(Region arg0) {
if (!haveDetectedBeaconsSinceBoot) {
Log.d(TAG, "auto launching MainActivity");
Intent RangingIntent = new Intent(this, Monitoring.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getApplicationContext().startForegroundService(RangingIntent);
} else {
getApplicationContext().startService(RangingIntent);
}
haveDetectedBeaconsSinceBoot = true;
} else {
if (monitoringActivity != null) {
Intent RangingIntent = new Intent(this, Monitoring.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getApplicationContext().startForegroundService(RangingIntent);
} else {
getApplicationContext().startService(RangingIntent);
}
}
}
范围代码
public class Monitoring extends Service implements BeaconConsumer {
protected static final String TAG = "RangingService";
private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onCreate() {
super.onCreate();
System.out.println("********STARTING RANGING*********");
beaconManager.bind(this);
}
@Override
public void onDestroy() {
super.onDestroy();
beaconManager.unbind(this);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
Log.d(TAG, "didRangeBeaconsInRegion called with beacon count: "+beacons.size());
Log.d(TAG, String.valueOf(beacons.iterator().next()));
Beacon firstBeacon = beacons.iterator().next();
}
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) { }
}
}
PS:我想在应用被杀死时尝试获取测距日志
答案 0 :(得分:0)
如果使用通配符区域,将每个标识符设置为null,那么您将无法使用监视API读取标识符。两种选择:
定义多个区域,为每个区域指定UUID,然后监视所有这些区域。收到回调后,作为参数传递的Region对象在调用region.getId1()
时将包含UUID。
除了监视API外,还使用测距API。 (在调用didEnterRegion之后,您不必打开测距,您可以在监视的同时将其打开并保持打开状态。)打开测距时,您将获得对{{1}的回调},其中包含检测到的实际信标的列表。然后,您可以从该回调中读取第一个标识符。