現在、AltBeacon (以前は Radius Network) の Android-Beacon-Library を利用する Android アプリを作成しています。
ビーコンが表示されたときにアプリに通知を表示する必要があります。これは、バックグラウンドでアプリを開始するヘッダーの下のサンプル コードで詳しく説明されているように、Bootstrap Notifier を使用して実現しました。(アプリケーションを起動するのではなく、通知を表示するようにこのコードを変更します)。
ただし、モバイル デバイスからビーコンまでの距離を測定できるように、別のアクティビティで RangeNotifier をセットアップするアプリも必要です。上記のリンクのRaning Example Codeヘッダーの下にあるサンプル コードを変更することによっても、これを行いました。
ただし、これを行ったとき、アクティビティへのバインドとRangingNotifierのセットアップでは問題ないように見えましたが、アクティビティを破棄すると、アクティビティによって実装された BeaconConsumer のバインドが解除されないようで、didRangeBeaconsInRegion(...)
関数内のコードは onDestroy( ) が呼び出されていました。
beaconManager.stopRangingBeaconsInRegion(region);
そのため、呼び出す前に呼び出しを試みたところbeaconManager.unbind(this);
、内部のコードのdidRangeBeaconsInRegion(...)
実行が停止したように見えましたが、アクティビティが破棄された後も、各スキャンの間に遅延なく Bluetooth 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 を使用することは可能ですか?
長い質問で申し訳ありません。他の場所でこれを詳しく説明しているものを見つけることができなかったようです!