Also das ist meine Situation:IBeacon nicht in einem Hintergrunddienst entdeckt
Ich bin eine Anwendung bilding, die überprüfen müssen, ob es eine registrierte Leuchtfeuer in der Nähe ist (ich benutze GoogleAPI).
Dies muss auch dann erledigt werden, wenn die App nicht läuft, also verwende ich einen Dienst, der läuft, bis keine Baken mehr da sind.
Das Problem ist, dass, wenn ich die GoogleApiClient
innerhalb des Service erstellen, scheint die Nearby.Messages.subscribe
nicht zu arbeiten, während das gleiche tun, innerhalb einer Aktivität verursacht keine Probleme.
Dies ist der Code meines Dienstes
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();
}
}
MainActivity den Dienst in onCreate()
, binden sich in onStart()
und unbind in onStop()
starten.
Bei dieser Art von einem Hintergrund-Abonnement „Low-Power-Scans werden bei ausgelöst Bildschirm-zu Ereignissen“ und es eine BroadcastReceiver verwenden. Ich brauche einen Service, weil er unbegrenzt laufen kann und bereit ist, Scans von jeder Quelle (Aktivitäten und Alarme) auszulösen, aber wenn ich den GoogleApiClient im Service erstelle, scheint der onFound nie aufgerufen zu werden. –