iBeacon显示在后台服务没有发现
问题描述:
所以这是我的情况:iBeacon显示在后台服务没有发现
我bilding需要检查是否有附近的灯塔注册(我用GoogleAPI)的应用程序。
即使应用程序未运行,也必须执行此操作,因此我使用的服务运行至周围没有信标。
问题是,如果我在服务内部创建GoogleApiClient
,Nearby.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
在这种背景订阅的“低功耗扫描被触发,在屏幕上的事件”,它使用一个BroadcastReceiver。我需要使用服务,因为它可以无限期地运行,并准备好触发来自每个源(活动和警报)的扫描,但是如果我在服务中创建GoogleApiClient似乎永远不会调用onFound。 –