2017-01-06 3 views
0

Ich habe eine Klasse und einen BroadcastReceiver erstellt, um Rückrufe von der Awareness API für beim Gehen oder Laufen endet. Ich bekam keine zeitnahen Rückrufe und dachte zuerst, dass es war, weil ich einen 'stoppenden' Rückruf registriert hatte, aber nachdem ich mein Telefon ein wenig gesenkt hatte, erhielt ich mehrere Rückrufe! Aber das war weit entfernt von der Zeit, als ich aufgehört hatte zu gehen. Mindestens 5 Minuten nach dem Anhalten. Manchmal bekomme ich keine Rückrufe, selbst wenn die Google Fit App Aktivitäten aufzeichnet.Awareness API verzögert Aktivität Callbacks deutlich

Da ich mindestens ein paar Mal Rückrufe erhalten habe, weiß ich, dass die Registrierung in Ordnung ist. Warum werden die Anrufe verzögert und fehlen manchmal?

Als Hintergrundreferenz registriere ich diese Callbacks im onStart auf der Hauptaktivität, d. H. InitiateAwareness wird zu diesem Zeitpunkt innerhalb des Onstarts einer Aktivität aufgerufen. Und ich melde mich nie ab. Ich beabsichtige nicht, es so in der Produktion zu verwenden, es war nur zum Testen. Außerdem ist mein ursprünglicher Versuch, die Zäune mit einem Anwendungskontext zu registrieren, fehlgeschlagen.

Hier ist die Helferklasse, die ich gemacht habe, um die Registrierung des Google Clients und der Zäune einzurichten.

public class AwarenessHelper { 


public static final String WALKING_ENDED_FENCE = "walkingEndedKey"; 
public static final String RUNNING_ENDED_FENCE = "runningEndedKey"; 
public static final String TYPE_2_WALKING = "duringWalkingKey"; 
public static final String TYPE_2_RUNNING = "duringRunningKey"; 

private String tag = AwarenessHelper.class.getSimpleName(); 

public void initiateAwareness(final Activity context) 
{ 
    final GoogleApiClient googleApiClient = buildClient(context); 
    Log.d(tag, "Initiating blocking connect"); 
    googleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
     @Override 
     public void onConnected(@Nullable Bundle bundle) { 
      if (googleApiClient.isConnected()) 
      { 
       Log.d(tag, "Client connected, initiating awareness fence registration"); 
       registerAwarenessFences(context, googleApiClient); 
      } 
      else 
      { 
       Log.d(tag, "Couldn't connect"); 
      } 

     } 

     @Override 
     public void onConnectionSuspended(int i) { 

     } 


    }); 

    googleApiClient.connect(); 
} 

private void registerAwarenessFences(Context context, GoogleApiClient mGoogleApiClient) { 
    Awareness.FenceApi.updateFences(
      mGoogleApiClient, 
      new FenceUpdateRequest.Builder() 
        .addFence(WALKING_ENDED_FENCE, DetectedActivityFence.stopping(DetectedActivityFence.WALKING), getBroadcastPendingIntent(context)) 
        .addFence(RUNNING_ENDED_FENCE, DetectedActivityFence.stopping(DetectedActivityFence.RUNNING), getBroadcastPendingIntent(context)) 
        .addFence(TYPE_2_WALKING, DetectedActivityFence.during(DetectedActivityFence.WALKING), getBroadcastPendingIntent(context)) 
        .addFence(TYPE_2_RUNNING, DetectedActivityFence.stopping(DetectedActivityFence.RUNNING), getBroadcastPendingIntent(context)) 
        .build()) 
      .setResultCallback(new ResultCallback<Status>() { 
       @Override 
       public void onResult(@NonNull Status status) { 
        if (status.isSuccess()) { 
         Log.i(tag, "Fence was successfully registered."); 
        } else { 
         Log.e(tag, "Fence could not be registered: " + status); 
        } 
       } 
      }); 
} 

private GoogleApiClient buildClient(final Activity activity) 
{ 
    GoogleApiClient client = new GoogleApiClient.Builder(activity) 
      .addApi(Awareness.API) 
      .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
       @Override 
       public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
        if (connectionResult.hasResolution() && connectionResult.getErrorCode() == CommonStatusCodes.SIGN_IN_REQUIRED) 
        { 
         try { 
          connectionResult.startResolutionForResult(activity, GOOGLE_FIT_AUTHORIZATION_REQUEST_CODE); 
         } catch (IntentSender.SendIntentException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }) 
      .build(); 
    return client; 
} 

private PendingIntent getBroadcastPendingIntent(Context context) 
{ 
    Intent intent = new Intent(AWARENESS_BROADCAST_ACTION); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

    return pendingIntent; 
} 
} 

Hier ist der BroadcastReceiver:

public class AwarenessHelper { 


    public static final String WALKING_ENDED_FENCE = "walkingEndedKey"; 
    public static final String RUNNING_ENDED_FENCE = "runningEndedKey"; 
    public static final String TYPE_2_WALKING = "duringWalkingKey"; 
    public static final String TYPE_2_RUNNING = "duringRunningKey"; 

    private String tag = AwarenessHelper.class.getSimpleName(); 

    public void initiateAwareness(final Activity context) 
    { 
     final GoogleApiClient googleApiClient = buildClient(context); 
     Log.d(tag, "Initiating blocking connect"); 
     googleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { 
      @Override 
      public void onConnected(@Nullable Bundle bundle) { 
       if (googleApiClient.isConnected()) 
       { 
        Log.d(tag, "Client connected, initiating awareness fence registration"); 
        registerAwarenessFences(context, googleApiClient); 
       } 
       else 
       { 
        Log.d(tag, "Couldn't connect"); 
       } 

      } 

      @Override 
      public void onConnectionSuspended(int i) { 

      } 


     }); 

     googleApiClient.connect(); 
    } 

    private void registerAwarenessFences(Context context, GoogleApiClient mGoogleApiClient) { 
     Awareness.FenceApi.updateFences(
       mGoogleApiClient, 
       new FenceUpdateRequest.Builder() 
         .addFence(WALKING_ENDED_FENCE, DetectedActivityFence.stopping(DetectedActivityFence.WALKING), getBroadcastPendingIntent(context)) 
         .addFence(RUNNING_ENDED_FENCE, DetectedActivityFence.stopping(DetectedActivityFence.RUNNING), getBroadcastPendingIntent(context)) 
         .addFence(TYPE_2_WALKING, DetectedActivityFence.during(DetectedActivityFence.WALKING), getBroadcastPendingIntent(context)) 
         .addFence(TYPE_2_RUNNING, DetectedActivityFence.stopping(DetectedActivityFence.RUNNING), getBroadcastPendingIntent(context)) 
         .build()) 
       .setResultCallback(new ResultCallback<Status>() { 
        @Override 
        public void onResult(@NonNull Status status) { 
         if (status.isSuccess()) { 
          Log.i(tag, "Fence was successfully registered."); 
         } else { 
          Log.e(tag, "Fence could not be registered: " + status); 
         } 
        } 
       }); 
    } 

    private GoogleApiClient buildClient(final Activity activity) 
    { 
     GoogleApiClient client = new GoogleApiClient.Builder(activity) 
       .addApi(Awareness.API) 
       .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { 
        @Override 
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
         if (connectionResult.hasResolution() && connectionResult.getErrorCode() == CommonStatusCodes.SIGN_IN_REQUIRED) 
         { 
          try { 
           connectionResult.startResolutionForResult(activity, GOOGLE_FIT_AUTHORIZATION_REQUEST_CODE); 
          } catch (IntentSender.SendIntentException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }) 
       .build(); 
     return client; 
    } 

    private PendingIntent getBroadcastPendingIntent(Context context) 
    { 
     Intent intent = new Intent(AWARENESS_BROADCAST_ACTION); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

     return pendingIntent; 
    } 
} 

ich die Benachrichtigungen erhalten, aber nach einer massiven Verzögerung und manchmal gar nicht. Ich beginne die Aktivität viele Male, also werden die Zäune immer wieder registriert? Ist das eine relevante Tatsache? Ist ein Service- oder Broadcast-Empfängerkontext auch für die Initialisierung von Awareness Clients und Zäunen geeignet?

+0

Haben Sie eine Lösung dafür gefunden? – Dibzmania

Antwort

0

Awareness abonniert zu erhalten ActivityRecognition Updates eher selten, so ist es nicht sehr unerwartet, dass Sie eine Antwort nach ein paar Minuten erhalten.

Sie sollten sich auch Sorgen darüber machen, dass Sie zu viele Zäune haben, ohne sich im Allgemeinen abzumelden.

Auch gibt es keinen Grund, einen separaten pendingIntent für jeden Ihrer Zäune zu haben; Sie könnten eine einzige pendingIntent haben und alle Zäune gegen diese hinzufügen. Verwenden Sie den Zaunschlüssel, um die Ergebnisse jedes Zauns zu unterscheiden. Und wieder, tun Sie unregister, wenn es Sinn macht. Andernfalls könnten die Zäune auch nach dem Ausschalten der App hängen bleiben.