2016-07-21 20 views
0

所以這是我的情況:iBeacon顯示在後臺服務沒有發現

我bilding需要檢查是否有附近的燈塔註冊(我用GoogleAPI)的應用程序。

即使應用程序未運行,也必須執行此操作,因此我使用的服務運行至周圍沒有信標。

問題是,如果我在服務內部創建GoogleApiClientNearby.Messages.subscribe似乎無法正常工作,而在Activity中執行同樣的操作不會導致任何問題。

這是我的服務

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在onCreate()onStart()啓動該服務,綁定本身和onStop()解除綁定的代碼。

回答

0

訂閱有兩種方式:前臺和後臺。這聽起來像你想要的背景版本,它需要一個PendingIntent,並將在附近發現信標時啓動您的應用程序。

這裏有一個指南,找到信標時,您的應用程序在後臺: https://developers.google.com/nearby/messages/android/get-beacon-messages#subscribe_in_the_background

+0

在這種背景訂閱的「低功耗掃描被觸發,在屏幕上的事件」,它使用一個BroadcastReceiver。我需要使用服務,因爲它可以無限期地運行,並準備好觸發來自每個源(活動和警報)的掃描,但是如果我在服務中創建GoogleApiClient似乎永遠不會調用onFound。 –