2017-01-06 2 views
0

Я создал класс и BroadcastReceiver, чтобы получить обратные вызовы от осознания api, когда ходьба или бег заканчиваются. Я не получал своевременных обратных вызовов, и сначала подумал, что это произошло потому, что я зарегистрировал обратный вызов «остановки», но потом немного установил свой телефон, я получил несколько обратных вызовов! Но это было далеко от того времени, когда я перестал ходить. Не менее 5 минут после остановки. Иногда я не получаю обратные вызовы, даже если приложение Google Fit записывает активность.Awareness API задерживает активные обратные вызовы

Поскольку я получил обратные вызовы хотя бы несколько раз, я знаю, что регистрация в порядке. Почему звонки откладываются и иногда отсутствуют?

Для получения справочной информации я регистрирую эти обратные вызовы в onStart на основной активности, то есть инициирует уведомление в то время, в течение действия onstart. И я никогда их не регистрирую. Я не собираюсь использовать его таким образом в производстве, это было просто для тестирования. Плюс моя неудачная попытка регистрации ограждений с контекстом приложения не удалась.

Вот класс помощников, который я сделал, чтобы настроить регистрацию клиента и ограждений Google.

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

Вот 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; 
    } 
} 

я получаю уведомление, но после массовых задержек, а иногда и вовсе нет. Я начинаю деятельность много раз, поэтому, возможно, забор регистрируется снова и снова? Это важный факт? Также есть контекст приемника службы или вещания, подходящий для инициализации клиентов и заборов о знании?

+0

Вы нашли решение для этого? – Dibzmania

ответ

0

Awareness подписка на получение ActivityRecognition обновлений довольно редко, поэтому не так уж неожиданно, что вы получите ответ через несколько минут.

Вы также должны беспокоиться о том, что у вас слишком много заборов без регистрации в целом.

Также нет причин иметь отдельный pendingIntent для каждого из ваших заборов; у вас может быть один pendingIntent и добавить все ограждения против этого. Используйте ключ забора, чтобы отличить результаты каждого ограждения. И снова, сделайте unregister, когда это имеет смысл. В противном случае, ограждения могут повесить даже после того, как ваше приложение уйдет.