だから、これは私の状況です:iBeacon
が、私は近くの登録ビーコンは、(私はGoogleAPIを使用)があるかどうかを確認する必要があるアプリケーションをbildingだが。
これは、アプリケーションが実行されていないときでも実行する必要があります。そのため、ビーコンが存在しなくなるまで実行されるサービスを使用しています。
サービス内にGoogleApiClient
を作成すると、アクティビティ内で同じことをしても問題は発生しませんが、Nearby.Messages.subscribe
は機能しないようです。
これは私のサービスのコード
import android.Manifest;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.nearby.Nearby;
import com.google.android.gms.nearby.messages.Message;
import com.google.android.gms.nearby.messages.MessageListener;
import com.google.android.gms.nearby.messages.MessagesOptions;
import com.google.android.gms.nearby.messages.NearbyPermissions;
import com.google.android.gms.nearby.messages.Strategy;
import com.google.android.gms.nearby.messages.SubscribeOptions;
public class BeaconMessageReceiver extends Service implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = "BeaconMessageReceiver";
private GoogleApiClient mGoogleApiClient;
private MessageListener mMessageListener;
private IBinder mBinder = new LocalBinder();
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "BeaconMessageReceiver created");
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Nearby.MESSAGES_API, new MessagesOptions.Builder()
.setPermissions(NearbyPermissions.BLE)
.build())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(BeaconMessageReceiver.this)
.build();
}
createMessageListener();
mGoogleApiClient.connect();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class LocalBinder extends Binder {
public BeaconMessageReceiver getBeaconMessageReceiverInstance() {
return BeaconMessageReceiver.this;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
mGoogleApiClient.disconnect();
Log.d(TAG, "BeaconMessageReceiver destroyed");
}
@Override
public void onConnected(@Nullable Bundle bundle) {
checkBeacon();
}
@Override
public void onConnectionSuspended(int i) {}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {}
public void checkBeacon() {
enableBluetooth(); // subscribe in background don't automatically enable BT
subscribe();
}
private void createMessageListener() {
mMessageListener = new MessageListener() {
@Override
public void onFound(Message message) {
String messageAsString = new String(message.getContent());
Log.d(TAG, "Found message: " + messageAsString);
unsubscribe();
disableBluetooth();
}
@Override
public void onLost(Message message) {
String messageAsString = new String(message.getContent());
Log.d(TAG, "Lost sight of message: " + messageAsString);
unsubscribe();
disableBluetooth();
}
};
}
// Subscribe to messages.
private void subscribe() {
Log.i(TAG, "Subscribing for updates.");
SubscribeOptions options = new SubscribeOptions.Builder()
.setStrategy(Strategy.BLE_ONLY)
.build();
Nearby.Messages.subscribe(mGoogleApiClient, mMessageListener, options);
}
// Unsubscribe to messages
private void unsubscribe() {
Log.i(TAG, "Unsubscribing.");
Nearby.Messages.unsubscribe(mGoogleApiClient, mMessageListener);
}
private void toggleBluetooth() {
if (!BluetoothAdapter.getDefaultAdapter().isEnabled())
BluetoothAdapter.getDefaultAdapter().enable();
else
BluetoothAdapter.getDefaultAdapter().disable();
}
}
、onCreate()
にサービスを開始onStart()
自体に結合して、onStop()
にアンバインドMainActivityあります。
は、「低電力スキャンは、画面上のイベントでトリガされている」と、それはBroadcastReceiverを使用しています。私はサービスを無期限に実行し、すべてのソース(アクティビティとアラーム)からスキャンを開始する準備ができているため、サービスを使用する必要があります。ただし、GoogleApiClientを作成すると、onFoundが呼び出されないようです。 –