2016-06-27 17 views
0

ライブラリは正しくスキャンを続けますが、このモードではビーコンは検出されません。AltBeaconは、アプリケーションが閉じられたときにビーコンを検出しません。

私は多くの場所で読んでいますが、これが可能かどうかは非常に異なる意見です。 (私はそれがあると思いたい)IOS

、ネイティブSDKを使用して、この同じ実装では、任意の不便なしで実装することができ、それはアンドロイドで少しトリッキーなようです。

フォアグラウンドとバックグラウンドが適切な場合に動作します。

これは私のbeaconManager構成です:込み

public void setUpBeaconManager() throws RemoteException { 
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
    beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(MainActivity.this); 
    beaconManager.getBeaconParsers().clear(); 
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 
    beaconManager.setBackgroundBetweenScanPeriod(2000); 
    beaconManager.setForegroundBetweenScanPeriod(2000); 
    beaconManager.updateScanPeriods(); 
    beaconManager.bind(MainActivity.this); 
    } 
} 

@Override 
public void onBeaconServiceConnect() { 
    Log.e(Tags.MAIN_ACTIVITY, "Beacon "+beaconManager.checkAvailability()); 
    beaconManager.setRangeNotifier(new RangeNotifier() { 

    @Override 
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
     if (beacons.size() > 0) { 
     Beacon firstBeacon = beacons.iterator().next(); 
     if (finishedRequest) { 
      Log.e("", "beacon id1: " + firstBeacon.getId1()); 
      processDetectBeacons(firstBeacon.getId2().toInt(), firstBeacon.getId3().toInt()); 
     } 
     Log.e(Tags.MAIN_ACTIVITY, "Beacon " + firstBeacon.toString() + " is about " + firstBeacon.getDistance() + " meters away."); 
     } 
    } 
    }); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {beaconManager.unbind(this);} 
} 

私が読ん用BootstrapNotifier

public class ApplicationManager extends Application implements BootstrapNotifier 

public void onCreate() { 
    super.onCreate(); 
    initRegionBootstrap(); 
} 

private void initRegionBootstrap() { 
    Log.d("RegionBootstrap", "Init RegionBootstrap functionality!!!"); 
    Region region = new Region("xxxx-4xx2-4E98-xxx-Bx5B7xxxx893E", Identifier.parse("xxxx-4xx2-4E98-xxx-Bx5B7xxxx893E"), null, null); 
    regionBootstrap = new RegionBootstrap(this, region); 
} 

@Override 
public void didEnterRegion(Region region) { 
    Log.d("", "didEnterRegion: " + region); 
} 


@Override 
public void didExitRegion(Region region) { 
    Log.d("", "didExitRegion"); 
} 


@Override 
public void didDetermineStateForRegion(int i, Region region) { 
    Log.d("", "didDetermineStateForRegion"); 
} 

感謝を実装してみてください、私はあなたが助けることができると思います。

+0

BootstrapNotifierを使用する必要があります。 ApplicationManagerのonCreate()メソッドを表示できますか? – davidgyoung

+0

@davidgyoungは 'onCreate()'メソッドを追加しました – jose920405

答えて

2

示されたコードに基づいて、ビーコンが範囲内に現れることをシステムが検出するたびにApplicationManagerdidEnterRegion(Region region)を呼び出す必要があります。

いくつかのヒント:

  • 、前をあなたのアプリが、それは最初に自分のビーコンをオフにしたときに、フォアグラウンドであなたがexitイベントを取得し検証することにより、地域に既に存在するとは思いませんことを確認してくださいバックグラウンド検出テストを開始する。ライブラリのバージョン2.8では、exitイベントが発生するまで、アプリケーションを再起動しても、2番目の領域入力イベントは発生しません。

  • 4.xのバックグラウンドでスキャンが遅くなることを認識します。 Android 4.xのデフォルト動作は、スキャンが5分ごとに実行されることです。これは、それがバックグラウンド検出に長時間かかる可能性があることを意味します。 MainActivityのコードに基づいて、これを実行するとスキャンのバックグラウンド期間が2秒に増加します。ただし、アプリが強制終了された場合、このコードはアプリの再起動時にはアクティビティでは実行されず、スキャンは5分ごとに再度実行されます。十分に長く待ってください。

  • オン5.x低電力スキャンはバックグラウンドで使用されます。低消費電力スキャンの実装はデバイス固有です。 Nexus 5や5xなどの新しいデバイスでは、一定のスキャンが実行され、3〜6秒以内に結果がアプリに送信されます。 Samsung Galaxy S5デバイスでは、定期スキャンが15分ごとに行われます。したがって、バックグラウンド検出を取得するまでに最大15分かかることがあります。十分に長く待ってください。

  • アプリを終了すると、ライブラリは5分以内にスキャンサービスを再開しようとしますが、時間がかかることがあります。十分に長く待ってください。

  • アプリを殺す方法はいくつかありますが、それを殺す方法によってはスキャンプロセスを再開することができません。設定 - >アプリケーション - >マイアプリ - >強制停止でアプリを終了すると、OSはAndroidビーコンライブラリを再起動することを許可しません。タスクスイッチャからアプリケーションを強制終了すると、このような動作がいくつかのデバイスで発生するという報告がいくつかありますが、そのようなビルドを持つ電話機はまれです。コマンドラインでadb logcatまたはadb shell psを使用して、アプリを殺すのに5分かかるかどうかを確認します。

最善のアプローチは、ライブラリのReference Appを使ってみて、それがアプリを殺害した後、バックグラウンドでのビーコンを検出したかどうかを確認することであってもよいです。これにより、テスト方法とデバイス固有の問題のみを可能な限りの犯人として残して、コーディングの可能性を排除します。

+0

それがあなたのために働いた理由に関するコメントは、他の人にとって参考になるかもしれません。 – davidgyoung

+0

"15分まで"問題の回避策はありますか?この時間は、私たちのユースケースにとっては長すぎます。 – NickG

+0

はい。バックアップとして、Androidビーコンライブラリはバックグラウンドでも定期的に完全な高電力、低遅延スキャンを行います。デフォルトでは、これは5分ごとに10秒間であるため、Samsungデバイスであっても15分ごとではなく、少なくとも5分ごとに検出が表示されます。これでもまだ十分でない場合は、このバックグラウンドスキャン間隔を 'beaconManager.setBackgroundBetweenScanPeriod(xxx)'と 'beaconManager.setBackgroundScanPeriod(xxx)'で設定することができます。より多くのバッテリーをあなたが使用するアプリケーション。 – davidgyoung

関連する問題