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