0

参照アプリケーションでは、RegionBootstrap はカスタム アプリケーション クラスonCreate メソッドで初期化されます。もちろん、アプリケーション クラスはアクティビティが呼び出される前に呼び出されます。

アクティビティ内で RegionBootstrap を初期化する方法はありますか? RegionBootstrap の静的変数を作成して、別のアクティビティで呼び出すことができるようにしましたが、残念ながら機能しません。

BeaconApplication.regionBootstrap = new RegionBootstrap((BootstrapNotifier) this.getApplication(), downloadedBeacons);

初期化する必要のあるリージョンはサーバーから取得されるため、RegionBootstrap の初期化はアプリケーション クラスから取得してはなりません。

* 編集 *

public class LoginActivity extends ActionBarActivity {
    …
    /*** short version ***/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        /*** after successful login ***/
        BeaconApplication.beacons = downloadBeaconsFromServer();    
    }
}

public class BeaconActivity extends ActionBarActivity {
    …
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        …
        startService(new Intent(this, BeaconService.class));
    }
}

これは私が実装した場所ですBeaconConsumer

public class BeaconService extends Service implements BeaconConsumer {
    private BeaconManager beaconManager;
    private BeaconNotifier beaconNotifier;
    private RegionBootstrap regionBootstrap;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");
        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
        beaconManager.setBackgroundBetweenScanPeriod(1001);
        beaconManager.setBackgroundScanPeriod(101);
        beaconManager.setForegroundScanPeriod(101);
        beaconManager.setForegroundBetweenScanPeriod(1001);
        beaconNotifier = new BeaconNotifier(this);
        beaconManager.bind(this);
    }

    @Override
    public void onBeaconServiceConnect() {
        beaconManager.setMonitorNotifier(beaconNotifier);
        monitorBeacons();

        regionBootstrap = new RegionBootstrap(beaconNotifier, BeaconApplication.beacons);
    }

    private void monitorBeacons() {
        for (Region beacon : BeaconApplication.beacons) {
            try {
                Log.i(TAG, "Monitoring beacon " + beacon.getUniqueId());
                beaconManager.startMonitoringBeaconsInRegion(beacon);
            } catch (RemoteException e) {
                Log.e(TAG, "Monitoring beacon failed");
                e.printStackTrace();
            }
        }
    }
}

の実装BeaconNotifier

public class BeaconNotifier implements BootstrapNotifier {
    private Context context;

    public BeaconNotifier(Context context) {
            this.context = context;
    }

    @Override
    didEnter.. etc

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

1 に答える 1

1

以下を使用できます。

BeaconManager.setMonitorNotifier(MonitorNotifier);
BeaconManager.startMonitoringBeaconsInRegion(Region);

ただし、メソッドを使用するには、が接続さBeaconManagerれるまで待たなければならないことを忘れないでください。BeaconServiceこの方法では、アプリが強制終了された場合でもビーコンを監視する場合は、独自のサービスを作成する必要があることに注意してください。

ところで、私もかつて問題に直面したことを覚えていますRegionBootstrap。私はその問題を処理するためにトリックを使用しました。次のコードをテストできますか?

...
BeaconManager.bind(yourConsumer);
...
//wait until BeaconConsumer.onBeaconServiceConnect() is called
//write following code inside of onBeaconServiceConnect
RegionBootstrap dummy = new RegionBootstrap(mBootstrapNotifier, new Region("dummy", null, null, null));
dummy.disable();
//after this point you can create your own RegionBootstrap

ここに重要なポイントがあります。独自の を作成する必要がありますBootstrapNotifier。アクティビティでこれを行っている場合は、次のことができます。

public class YourActivity extends Activity implements BootstrapNotifier {
    ...
    BootstrapNotifier mBootstrapNotifier = this;
    ...

またはApplicationクラスで:

public class YourApp extends Application implements BootstrapNotifier {
    ...
    BootstrapNotifier mBootstrapNotifier = this;
    ...

私の場合、アダプターを作成しましたContext。そのアダプターはコンストラクターで必要であり、そのアダプターを次のように使用しましたBootstrapNotifier

public class AltBeaconAdapter implements BootstrapNotifier {
    private Context mContext;
    ...

    public AltBeaconAdapter(Context context) {
        mContext = context;
        ...
    }

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

    ...
}

また、は のサブクラスであるMonitorNotifierため、メソッドを実装する必要があります。BootstrapNotifierMonitorNotifier

はい、このトリックは奇妙で、初期化時にライブラリにエラーがあることを示していますが、RegionBootstrapサービスがあるので、提案した最初の方法に切り替えました。このトリックがあなたにも当てはまる場合は、ライブラリの GitHub ページで問題を作成できるようにお知らせください。

于 2015-02-22T22:16:48.023 に答える