2016-07-21 7 views
0

だから、これは私の状況です:iBeacon

が、私は近くの登録ビーコンは、(私はGoogleAPIを使用)があるかどうかを確認する必要があるアプリケーションをbildingだが。

これは、アプリケーションが実行されていないときでも実行する必要があります。そのため、ビーコンが存在しなくなるまで実行されるサービスを使用しています。

サービス内にGoogleApiClientを作成すると、アクティビティ内で同じことをしても問題は発生しませんが、Nearby.Messages.subscribeは機能しないようです。

これは私のサービスのコード

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(); 
     } 
    } 

onCreate()にサービスを開始onStart()自体に結合して、onStop()にアンバインドMainActivityあります。

答えて

0

登録するには、フォアグラウンドとバックグラウンドの2つの方法があります。あなたがPendingIntentを取るバックグラウンドバージョンを望んでいるように聞こえて、近くにビーコンが発見されたときにあなたのアプリを起動します。ここで

は、あなたのアプリがバックグラウンドで動作しているとき、ビーコンを見つけるためのガイドです:バックグラウンドのサブスクリプションのこのタイプの https://developers.google.com/nearby/messages/android/get-beacon-messages#subscribe_in_the_background

+0

は、「低電力スキャンは、画面上のイベントでトリガされている」と、それはBroadcastReceiverを使用しています。私はサービスを無期限に実行し、すべてのソース(アクティビティとアラーム)からスキャンを開始する準備ができているため、サービスを使用する必要があります。ただし、GoogleApiClientを作成すると、onFoundが呼び出されないようです。 –

関連する問題