2016-05-11 6 views
0

入力した地域に自分のアプリを表示するのに問題があり、サンプルhereに従っています。 私がActivtyにBeaconManagerをbindしても動作しませんが、私が行ったとき、私はアプリケーションからのアクティビティからログを取得し、アプリケーションは表示されませんが表示されません。ビーコンマネージャがバインドされているときにバックグラウンドでアプリを起動する

バックグラウンドでアプリケーションを起動するためにクラスextends Application implements BootstrapNotifierを使用できますか?モニタ/レンジングを処理するクラスextends AppCompatActivity implements BeaconConsumerを使用することができますか?または、アプリケーションクラス内のすべてを処理する必要がありますか?打ち上げ?

(不正なコードブロックのため申し訳ありませんが、私は正しく、このstackoverflowのコードの事を処理することはできません)

public class BeaconActivity extends AppCompatActivity implements BeaconConsumer { 

    protected final String TAG = "BeaconActivity"; 
    private BeaconManager beaconManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "onCreate()"); 
     setContentView(R.layout.activity_beacon); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     RangedBeacon.setSampleExpirationMilliseconds(8000); 
     beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.bind(this); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "Unbind Beaconmanager"); 
     beaconManager.unbind(this); 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
     beaconManager.setMonitorNotifier(new MonitorNotifier() { 
      @Override 
      public void didEnterRegion(final Region region) { 
       Log.d(TAG, "Enter Region identifier: " + region.getId1() + ", " + region.getId2() + ", " + region.getId3()); 
      } 

      @Override 
      public void didExitRegion(final Region region) { 
       Log.d(TAG, "Exit Region identifier: " + region.getId1() + ", " + region.getId2() + ", " + region.getId3()); 
      } 

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

      } 
     }); 

     beaconManager.setRangeNotifier(new RangeNotifier() { 
      @Override 
      public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
       for (final Beacon beacon : beacons) { 
        final String distance = new DecimalFormat("##.######").format(beacon.getDistance()); 
        Log.d(TAG, "Distance: " + distance + ". This beacon has identifiers:" + beacon.getId1() + ", " + beacon.getId2() + ", " + beacon.getId3()); 
       } 
      } 
     }); 

     try { 
      Region region = new Region("all", null, null, null); 
      beaconManager.startMonitoringBeaconsInRegion(all); 
      beaconManager.startRangingBeaconsInRegion(all); 
     } catch (RemoteException e) { 
     } 
    } 
} 



public class BeaconApplication extends Application implements BootstrapNotifier { 

     private static final String TAG = "BeaconApplication"; 
     private RegionBootstrap regionBootstrap; 

     @Override 
     public void onCreate() { 
      super.onCreate(); 
      Log.d(TAG, "App started up"); 
      BeaconManager 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,d:25-25")); 

      Region all = new Region("all", null, null, null); 
      regionBootstrap = new RegionBootstrap(this, all); 
     } 

     @Override 
     public void didEnterRegion(Region region) { 
      Log.d(TAG, "Enter region " + region.getUniqueId()); 
    //  regionBootstrap.disable(); 
      Intent intent = new Intent(this, BeaconActivity.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      this.startActivity(intent); 
     } 

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

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

編集: 私はほんの少しを台無しかもしれないと思います。説明しましたhereアプリが殺された場合にのみ起動します(タスクスイッチャーではなくなりました)。タスクスイッチャーで使用できる場合は、バックグラウンドで着信イベントを処理するだけで、アクティビティログを取得できます。

+0

「アクティビティでのバインディングがバックグラウンドの起動に失敗するため」という意味を説明できますか? – davidgyoung

+0

私は 'beaconManager.bind(this);'を呼び出すと思ったが、BeaconActivityでは、BeaconApplicationからのバックグラウンドの起動はもはや動作しない。しかし、なぜ私は今なぜ知っていると思います(編集を参照)。 BeaconManagerをアクティビティにバインドしても、アプリケーションクラスにまったく影響しないことを確認できますか? – Zuop

+0

アプリケーションクラスには影響しません。それがRangingActivityが参照アプリケーションでどのように動作するかです:https://github.com/AltBeacon/android-beacon-library-reference/blob/master/app/src/main/java/org/altbeacon/beaconreference/RangingActivity.java – davidgyoung

答えて

0

問題は、アプリケーションにmonitorNotifierの1つしか含めることができないということです。 RegionBootstrapクラスは内部で1つを設定し、それを使用してApplicationクラスへのコールバックを取得します。

上記のコードはここにmonitorNotifierを変更します。

public void onBeaconServiceConnect() { 
    beaconManager.setMonitorNotifier(new MonitorNotifier() { 
... 

その行が実行された後、RegionBootstrapは、入口/出口イベント上の任意のより多くのコールバックを得ることはありません、ともApplicationクラスがします。したがって、問題はbind()コールではなく、setMonitorNotifierコールです。

あなたがRegionBootstrapを使用し続けたい場合は、あなたのアプリケーションクラスの入口/出口イベントのすべてを取得するようにコードをリファクタリングし、何とか自分のActivityにそれらをオフに合格する必要がありますので、ライブラリは、複数のmonitorNotifiersを許可していません。 。

+0

さて、問題は私が(アプリケーションクラスで)終了領域呼び出しを取得しないということです。タスクスイッチャーでアプリを終了したときに限り、exit領域がトリガーされます。私はアプリケーションクラスも追加して以来、BeaconActivityのレンジングは機能しません。 'rangingNotifier'も1つしか許されていませんか?アクティビティは表示されますが、スキャン時間を速く設定する必要がありますか?最初のサンプル(1つのアクティビティで監視/レンジング)を結合し、バックグラウンドの起動例を追加するのは本当に苦労します。しかし、私は主な問題に答えたと思います。 – Zuop

+0

はい、 'BeaconManager'はシングルトンなので、いつでもレンジング通知機能が有効になります。Applicationクラスの 'BackgroundPowerSaver'を使って、バックグラウンドモードを直接設定するメソッドを呼び出さずに、バックグラウンドからフォアグラウンドに移動するときに自動的にスキャン間隔を設定することをお勧めします。 – davidgyoung

関連する問題