3

現在、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 を使用することは可能ですか?

長い質問で申し訳ありません。他の場所でこれを詳しく説明しているものを見つけることができなかったようです!

4

1 に答える 1

0

私があなただったら、Application クラスにすべてのビーコン関連のものを用意し、LocalBroadcastManager を使用して、アプリの他の部分に測距について知らせます。

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

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 に答える