3

我目前正在编写一个使用 AltBeacon(以前是 Radius Network)的 Android-Beacon-Library 的 android 应用程序。

我要求应用程序在看到信标时显示通知,这是我使用引导通知程序实现的,如在后台启动应用程序标题下的示例代码中详述。(修改此代码以显示通知,而不是启动应用程序)。

但是,我还需要该应用程序在另一个活动中设置 RangeNotifier,以便我可以测量信标与移动设备的距离。我还通过修改上面链接中的示例代码来做到这一点,位于测距示例代码标题下。

然而,当我这样做时,绑定到活动并设置 RangingNotifier 似乎很好,但是在销毁活动时,它似乎并没有取消绑定活动实现的 BeaconConsumer 并且didRangeBeaconsInRegion(...)函数内的代码继续执行,即使 onDestroy( ) 被调用。

所以我在调用beaconManager.stopRangingBeaconsInRegion(region);之前尝试调用beaconManager.unbind(this);,这似乎阻止了其中的代码didRangeBeaconsInRegion(...)执行,但是在活动被破坏后,我仍然在日志中看到蓝牙 LE 反复扫描,每次扫描之间没有延迟。

08-14 11:09:50.527: D/BluetoothAdapter(21572): stopLeScan()
08-14 11:09:50.537: D/BluetoothAdapter(21572): startLeScan(): null
08-14 11:09:50.547: D/BluetoothAdapter(21572): onClientRegistered() - status=0 clientIf=7

通常,当我使用 RangingNotifier 上传新构建并返回特定活动时,我会收到以下错误:

java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:300)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:841)
Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
    at org.altbeacon.beacon.service.BeaconService$ScanProcessor.doInBackground(BeaconService.java:609)
    at org.altbeacon.beacon.service.BeaconService$ScanProcessor.doInBackground(BeaconService.java:602)
    at android.os.AsyncTask$2.call(AsyncTask.java:288)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    ... 4 more

这让我相信 BeaconManager 可能不会从 Activity 中解除绑定。

是否可以通过使用应用程序类同时使用后台监控,并在同一应用程序的活动中使用 RangingNotifier?

抱歉,这个问题很长,似乎在其他地方找不到任何详细说明!

4

1 回答 1

0

如果我是你,我会在你的 Application 类中包含所有与信标相关的东西,然后使用 LocalBroadcastManager 让你应用程序的其他部分知道测距:假设 RANGING_DONE 是一个公共静态最终 String RANGING_DONE = "RANGING_DONE";

Intent rangingDoneIntent = new Intent(YourAppClass.RANGING_DONE);
LocalBroadcastManager.getInstance(this).sendBroadcast(
            rangingDoneIntent);

您甚至可以将信标添加到 Intent,因为它们实现了 Parcelable。

然后在您的活动中,监听 RANGING_DONE 意图:

LocalBroadcastManager.getInstance(this).registerReceiver(mRangingDoneReciever, new IntentFilter(YourAppClass.RANGING_DONE));

其中 mRangingDoneReciever 是 BroadcastReciever:

private BroadcastReceiver mRangingDoneReciever = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        //Do something with the recieved ranging....
    }
}

我希望我能用我的答案...

/史蒂芬

于 2014-10-27T09:10:06.730 回答