0

RadiusNetworks Android iBeacon Library を使用しています。バックグラウンド プロセスで iBeacon 測距を行いたいのですが、ビーコン情報をアプリケーションにブロードキャストします。別のプロセスで実行されているサービスに iBeaconManager をバインドしようとしましたが、サービスが onIBeaconServiceConnect() コールバックに到達しないため、機能していないようです。

別のプロセスでの TestService:

public class TestService extends Service implements IBeaconConsumer{

public static final String START_SERVICE = "com.example.intent.action.START";
public static final String SEND_PROXID = "com.example.intent.action.PROX";

private String proxID;
private static final String TAG = TestService.class.getSimpleName();
private IBeaconManager iBeaconManager;  
private Region currentRegion;
private boolean checkedRecently = false;

  private Timer timer;
  private TimerTask updateTask = new TimerTask() {
    @Override
    public void run() {
        checkedRecently = false;
         Log.i(TAG, "Resetting checked recently");
    }
  };

  @Override
  public int onStartCommand(Intent intent, int flags, int startId){
     int ret; 
     ret = super.onStartCommand(intent, flags, startId);
     Log.i(TAG, "Got to onStartCommand");
     if(intent.getAction().equals(START_SERVICE)){
         Log.i(TAG, "Service received start intent");
     }
     else if(intent.getAction().equals(SEND_PROXID)){
         Log.i(TAG, "Service received PROXID intent");
         proxID = intent.getStringExtra("prox");
         System.out.println(proxID);
         iBeaconManager = IBeaconManager.getInstanceForApplication(this);
        iBeaconManager.bind(this);
     }
     return ret;
       }

  @Override
  public IBinder onBind(Intent intent) {
      Log.i(TAG, "onBIND called");
    return null;
  }

  @Override
  public void onCreate() {
    super.onCreate();
    Log.i(TAG, "Service creating");

    timer = new Timer("TestTimer");
    timer.schedule(updateTask, 1000L, 20 * 1000L);

  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.i(TAG, "Service destroying");

    timer.cancel();
    timer = null;
    iBeaconManager.unBind(this);
    iBeaconManager = null;
  }

  @Override
    public void onIBeaconServiceConnect() {
      Log.i(TAG, "iBeacon service connect");
        iBeaconManager.setRangeNotifier(new RangeNotifier() {
        @Override 
        public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
            if (iBeacons.size() > 0 && !checkedRecently) {
                checkedRecently = true;
                Log.i(TAG, "Service found beacon, sending data");
            Intent i = new Intent();
            i.setAction(ServiceReceiver.DID_ENTER);
            i.putExtra("maj", Integer.toString(iBeacons.iterator().next().getMajor()));
            i.putExtra("min", Integer.toString(iBeacons.iterator().next().getMinor()));
            sendBroadcast(i);
            }
        }
        });

        currentRegion = new Region("myRangingUniqueId", proxID, null, null);
        try {
            iBeaconManager.startMonitoringBeaconsInRegion(currentRegion);
        } catch (RemoteException e) {   }

    }

}

AndroidManifest.xml

<service
        android:name=".TestService"
        android:exported="false"
        android:process=":remote" >
        <intent-filter>
            <action android:name="com.example.intent.action.PROX" />
            <action android:name="com.example.intent.action.START" />
        </intent-filter>
    </service>
<receiver android:name="ServiceReceiver" >
        <intent-filter>
            <action android:name="com.example.intent.action.DIDENTER" >
            </action>
        </intent-filter>
    </receiver>

サーバーから関連する proxID をフェッチし、それをサービスに送信します。その時点で、サービスにバインドして、prox に一致する地域の範囲を開始できるはずです。しかし、サービスに正常にバインドできないようです。助けてくれてありがとう。投稿されたコードを更新する必要があるかどうか教えてください。

4

1 に答える 1

0

AndroidManifest.xmlAndroidIBeaconLibrary に必要な適切なエントリを取得できているのだろうか。ライブラリは、マニフェスト マージと呼ばれる機能に依存して、ライブラリのサービス エントリをマニフェストに取得します。これは、Eclipse または Android Studio のプロジェクトで有効にする必要があります。生成されたマニフェストのビルド ディレクトリを確認し、AndroidIBeaconService.

とはいえ、独自のバックグラウンド サービスを作成するのは少しやり過ぎかもしれません。Android iBeacon ライブラリには既にバックグラウンド クラスがあることを理解してAndroidIBeaconServiceください (上記のとおり)。そのため、独自のサービスを実際に作成する必要はありません。必要なのは、Activity よりもライフサイクルが長いもの (カスタム AndroidApplicationクラスなど) にサービスをバインドすることだけです。これにより、Activity がバインドを解除してもサービスが停止しなくなります。

Android iBeacon ライブラリの Pro バージョンがあり、これらすべてを自動的に設定し、アプリがバックグラウンドにあるときはスキャンを遅くしてバッテリーを節約し、バックグラウンドでアプリを自動的に起動して iBeacon を検索します。手動で起動しません。Pro バージョンでこれを行う方法を示すサンプル コードは、こちらの「バックグラウンド起動のサンプル コード」セクションにあります

完全な開示: 私は Radius Networks のチーフ エンジニアであり、Android iBeacon ライブラリの主要な作成者です。

于 2014-06-11T20:30:07.697 に答える