2016-07-21 28 views
0

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.

Antwort

0

Es gibt zwei Möglichkeiten zum Abonnieren: Vordergrund und Hintergrund. Es klingt wie die Hintergrundversion, die einen PendingIntent erfordert, und startet Ihre App, wenn ein Beacon in der Nähe entdeckt wird.

Hier ist ein Leitfaden zu finden, Baken, wenn die App im Hintergrund ist: https://developers.google.com/nearby/messages/android/get-beacon-messages#subscribe_in_the_background

+0

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. –