监视信标时如何获取UUID?

时间:2018-09-28 15:57:12

标签: android ibeacon altbeacon ibeacon-android

我正在使用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:我想在应用被杀死时尝试获取测距日志

1 个答案:

答案 0 :(得分:0)

如果使用通配符区域,将每个标识符设置为null,那么您将无法使用监视API读取标识符。两种选择:

  1. 定义多个区域,为每个区域指定UUID,然后监视所有这些区域。收到回调后,作为参数传递的Region对象在调用region.getId1()时将包含UUID。

  2. 除了监视API外,还使用测距API。 (在调用didEnterRegion之后,您不必打开测距,您可以在监视的同时将其打开并保持打开状态。)打开测距时,您将获得对{{1}的回调},其中包含检测到的实际信标的列表。然后,您可以从该回调中读取第一个标识符。