iBeacon显示在后台服务没有发现

问题描述:

所以这是我的情况: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()解除绑定的代码。

订阅有两种方式:前台和后台。这听起来像你想要的背景版本,它需要一个PendingIntent,并将在附近发现信标时启动您的应用程序。

这里有一个指南,找到信标时,您的应用程序在后台: https://developers.google.com/nearby/messages/android/get-beacon-messages#subscribe_in_the_background

+0

在这种背景订阅的“低功耗扫描被触发,在屏幕上的事件”,它使用一个BroadcastReceiver。我需要使用服务,因为它可以无限期地运行,并准备好触发来自每个源(活动和警报)的扫描,但是如果我在服务中创建GoogleApiClient似乎永远不会调用onFound。 –