1

AltBeacon の Android-Beacon-Library を利用する Android アプリのカスタム クラスを作成しています。

クラスを投稿する代わりに、ライブラリで提供される参照実装サンプルを使用して問題を再現しています。

監視 (RegionBootstrap の実装による) とレンジング beaconManager.bind(new BeaconConsumer()...) の両方を onCreate() で直接有効にすると、すべてが完全に機能します。

ただし、ビーコンが region に入ったときにのみ測距を開始したいので、 RegionBootstrap の didEnterRegion(Region arg0) コールバックで、しかしそうすると、 onBeaconServiceConnect() は決して呼び出されません。このようにすると、バッテリー消費の面でより効率的になると思います。

メインスレッドでの強制実行と遅延タイマーの使用を試みましたが、うまくいきませんでした。

誰でもこれを機能させることができますか?どんな助けでも大歓迎です!

public class BeaconReferenceApplication extends Application implements BootstrapNotifier {

    private static final String TAG = "AndroidProximityReferenceApplication";
    private RegionBootstrap regionBootstrap;
    private BackgroundPowerSaver backgroundPowerSaver;
    BeaconManager beaconManager;
    Context context = this;

    public void onCreate() {
        super.onCreate();
        beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
        // Setup beacon layout - should be done once only
        List<BeaconParser> bp = beaconManager.getBeaconParsers();
        bp.add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));

        Region region = new Region("backgroundRegion", null, null, null);
        regionBootstrap = new RegionBootstrap(this, region);
        backgroundPowerSaver = new BackgroundPowerSaver(this);

        // THIS WORKS
        bindBeaconConsumer();
    }

    public void bindBeaconConsumer() {
        beaconManager.bind(new BeaconConsumer() {
            @Override
            public void onBeaconServiceConnect() {
                // ISSUE : Does not pass here when bindBeaconConsumer() is called from didEnterRegion

                // Set Range Notifier and start ranging
            }

            @Override
            public Context getApplicationContext() {
                return context;
            }

            @Override
            public void unbindService(ServiceConnection serviceConnection) {
                context.unbindService(serviceConnection);
            }

            @Override
            public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) {
                return context.bindService(intent, serviceConnection, i);
            }
        });
    }

    @Override
    public void didEnterRegion(Region arg0) {
        Log.d(TAG, "did enter region.");

        // THIS DOESN'T WORK : onBeaconServiceConnect() never called
        // bindBeaconConsumer();
    }

    @Override
    public void didExitRegion(Region region) {
    }

    @Override
    public void didDetermineStateForRegion(int state, Region region) {
    }
}
4

1 に答える 1

2

モニタリング コールバックで呼び出しbindBeaconConsumer()が機能しない理由は、それが実行されるまでに、クラスが既にサービスにバインドされているためです。LogCat を見ると、これに関する警告メッセージが表示されます。既にバインドされているため、コードは へのコールバックを取得しませんonBeaconServiceConnect()

すでにバインドされているのはなぜですか?以下の行のため:

regionBootstrap = new RegionBootstrap(this, region);

このRegionBootsrapクラスは、バックグラウンドでバインド操作を実行します。これは 1 秒ほどで実行されます。

bindBeaconConsumer()これを修正する最も簡単な方法は、メソッド内のへの呼び出しを削除しdidEnterRegion、代わりに を呼び出すことbeaconManager.startRangingBeaconsInRegion(...)です。その時点までに、サービスは既にバインドされているため、再度バインドする必要はありません。

于 2015-03-05T21:05:54.273 に答える