0

我正在尝试在 Android 中获取 Gimbal 信标距离更改运行时。我能够连接到我的信标,并且同样反映在 android 应用程序中。

但我无法在应用程序中获取更改后的 RSSI。下面是我的代码。

private PlaceManager placeManager;
private PlaceEventListener placeEventListener;
private ArrayAdapter<String> listAdapter;
private ListView listView;
private BeaconManager bm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1);
    listView = (ListView) findViewById(R.id.list);
    listView.setAdapter(listAdapter);

    listAdapter.add("Setting API Key");
    listAdapter.notifyDataSetChanged();
    Gimbal.setApiKey(this.getApplication(), "my key");

    bm = new BeaconManager();
    bm.addListener(new BeaconEventListener() {
        @Override
        public void onBeaconSighting(BeaconSighting beaconSighting) {

            super.onBeaconSighting(beaconSighting);

            Log.d("beacon1", beaconSighting.getBeacon().toString());
            Log.d("beacon2", String.format("", beaconSighting.getRSSI()));
        }
    });
    bm.startListening();


    placeEventListener = new PlaceEventListener() {

        @Override
        public void onVisitStart(Visit visit) {

            super.onVisitStart(visit);

            listAdapter.add(String.format("Start Visit for %s", visit.getPlace().getName()));
            listAdapter.notifyDataSetChanged();

            Log.d("1", String.valueOf(visit.getArrivalTimeInMillis()));
            Log.d("2", String.valueOf(visit.getDepartureTimeInMillis()));
            Log.d("3", String.valueOf(visit.getPlace()));
            Log.d("4", String.valueOf(visit.getDwellTimeInMillis()));
            /*BeaconSighting demo = new BeaconSighting();
            Beacon beac = demo.getBeacon();
            Log.d("", beac.getUuid());*/
        }

        @Override
        public void onVisitEnd(Visit visit) {

            super.onVisitEnd(visit);

            listAdapter.add(String.format("End Visit for %s", visit.getPlace().getName()));
            listAdapter.notifyDataSetChanged();

            Log.d("ending","ending");
        }
    };

    placeManager = PlaceManager.getInstance();
    placeManager.addListener(placeEventListener);
    placeManager.startMonitoring();

    CommunicationManager.getInstance().startReceivingCommunications();

下面是我的日志输出。

11-24 00:18:49.128 9801-9801/com.gimbal.hello_gimbal_android D/1: 1448353129095
11-24 00:18:49.128 9801-9801/com.gimbal.hello_gimbal_android D/2: 1448353076508
11-24 00:18:49.128 9801-9801/com.gimbal.hello_gimbal_android D/3: Place [identifier=D4786F227DA24C56D46884FD8A33F97E, name=abc, attributes=com.gimbal.android.a.a@123]
11-24 00:18:49.128 9801-9801/com.gimbal.hello_gimbal_android D/4: -52587
11-24 00:18:49.208 9801-9801/com.gimbal.hello_gimbal_android D/1: 1448353129095
11-24 00:18:49.208 9801-9801/com.gimbal.hello_gimbal_android D/2: 1448353076508
11-24 00:18:49.208 9801-9801/com.gimbal.hello_gimbal_android D/3: Place [identifier=6D63654565EA48D38D2D1F81E1D558F4, name=xyz, attributes=com.gimbal.android.a.a@456]
11-24 00:18:49.208 9801-9801/com.gimbal.hello_gimbal_android D/4: -52587
11-24 00:18:49.226 9801-9801/com.gimbal.hello_gimbal_android D/1: 1448353129095
11-24 00:18:49.226 9801-9801/com.gimbal.hello_gimbal_android D/2: 1448353076508
11-24 00:18:49.226 9801-9801/com.gimbal.hello_gimbal_android D/3: Place [identifier=A6E32B4B5FBF5849F7ED78FBF02D701, name=lmn, attributes=null]
11-24 00:18:49.226 9801-9801/com.gimbal.hello_gimbal_android D/4: -52587
11-24 01:33:39.383 21329-21329/com.gimbal.hello_gimbal_android D/beacon1: Beacon [identifier=uid123, name=abc, iconURL=null, batteryLevel=HIGH, temperature=74]
11-24 01:33:39.383 21329-21329/com.gimbal.hello_gimbal_android D/beacon2: -62

这就是问题所在。

日志“beacon1”和“beacon2”被随机/不规则地打印。我不明白为什么“ BeaconEventListener ”有这样的行为。大多数时候它根本没有打印出来。因此,我没有被路障,因为我在移动时无法获得手机和信标之间的距离。

编辑

能够提取更多错误日志。在 logcat 输出中添加了最后 2 行。

任何帮助表示赞赏。

4

1 回答 1

0

Gimbal 团队几乎解决了这个问题,所以以后遇到这个问题的人也可以得到帮助。

在我的 OP 中,您可以看到下面是我的代码的原始部分。

bm = new BeaconManager();
bm.addListener(new BeaconEventListener() {
    @Override
    public void onBeaconSighting(BeaconSighting beaconSighting) {

        super.onBeaconSighting(beaconSighting);

        Log.d("beacon1", beaconSighting.getBeacon().toString());
        Log.d("beacon2", String.format("", beaconSighting.getRSSI()));
    }
});
bm.startListening();

现在我们也必须添加onBeaconSighting()PlaceEventListener()所以代码的新部分如下所示。

 placeEventListener = new PlaceEventListener() {

    @Override
    public void onVisitStart(Visit visit) {

        super.onVisitStart(visit);
        //do anything
    }

     @Override
     public void onVisitEnd(Visit visit) {

        super.onVisitEnd(visit);
        //do anything
     }

     public void onBeaconSighting(BeaconSighting sighting, List<Visit> visits) { 
     // This will be invoked when a beacon assigned to a place within a current visit is sighted. 
    }
  }

Gimbal 团队回复了我们添加重复或更确切地说是另一个侦听器的原因如下。

:你能告诉我为什么添加一个重复的监听器会使代码工作吗?由于此侦听器已在 BeaconManger 中处理,因此它应该可以工作。

Gimbal Team:当看到分配给当前访问中某个地点的信标时,将调用 PlaceManager 中的 onBeaconSighting。当看到信标时,将调用 BeaconManager 中的 onBeaconSighting。

我想我已经很清楚问题出在哪里以及如何解决了。希望对你也有帮助。

干杯。

于 2015-12-27T21:18:29.707 回答