Подтвердить что ты не робот

Получить текущую активность от Google Fit API Android

Я работаю над демо-приложением, чтобы получить образец текущей активности с помощью Google Fit. Я могу правильно получить скорость, а также расстояние. Но он не очень часто возвращает "in_vehicle" или "велосипедное" состояние, хотя я был в том же состоянии. Найдите прилагаемый скриншот для этого же. Я получил скорость 59.40KM/H (36.91 M/h) и в то время он не возвращал состояние активности "in_vehicle".

Просьба предоставить решение/обратную связь для того же самого.

Код:

@Override
 public void onDataPoint(DataPoint dataPoint) {
     for (Field field : dataPoint.getDataType().getFields()) {
        Value val = dataPoint.getValue(field);
           if(field.getName().trim().toLowerCase().equals("activity"))
                    {
                        if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("biking"))
                        {
                            strState = "Cycling";
                        }
                        else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("in_vehicle"))
                        {
                            strState = "Automotive";
                        }
                        else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("walking"))
                        {
                            strState = "Walking";
                        }
                        else
                        {
                            strState = "Not Moving";
                        }
                    }
            }
}

Спасибо.

IMAGE

4b9b3361

Ответ 1

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

if (strState.equals("Automotive") && speed == 0.00)
{
   strState = "Not Moving";
}
else if (strState.equals("Not Moving") && speed > 5)
{
   strState = "Automotive";
}
else
{
   strState = "strState";
}

Это может быть неверно, но это даст вам результат со стороны.

Ответ 2

Здесь вы можете найти образец проекта.

https://github.com/cyfung/ActivityRecognitionSample

Важное примечание: вы не можете получать данные так часто, как вы просили!

Начиная с API 21, действия могут приниматься реже, чем параметр detectIntervalMillis, если устройство находится в энергосбережении и экран выключен.

Ключевые компоненты:

Создайте GoogleApiClient в onCreate

mGoogleApiClient =
        new GoogleApiClient.Builder(this).addApi(ActivityRecognition.API)
            .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();

Подключить и отключить клиент api в onStart и onStop, как указано в документации Google Api.

  @Override
  protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
    mStatusView.setText("connecting");
  }

  @Override
  protected void onStop() {
    super.onStop();
    mGoogleApiClient.disconnect();
    mStatusView.setText("disconnected");
  }

Начать распознавание активности (не следует вызывать перед подключением Google Api). Используйте PendingIntent.getService для создания ожидающего намерения в качестве обратного вызова.

final PendingResult<Status>
    statusPendingResult =
    ActivityRecognition.ActivityRecognitionApi
        .requestActivityUpdates(mGoogleApiClient, DETECT_INTERVAL, PendingIntent
            .getService(this, 0, new Intent(this, ActivityDetectionService.class),
                          PendingIntent.FLAG_UPDATE_CURRENT));
statusPendingResult.setResultCallback(this);

IntentService - стандартный метод, предложенный для обратного вызова

public class ActivityDetectionService extends IntentService {

  protected static final String TAG = "activityDetectionService";

  public ActivityDetectionService() {
    super(TAG);
  }

  @Override
  protected void onHandleIntent(Intent intent) {
    final ActivityRecognitionResult
        activityRecognitionResult =
        ActivityRecognitionResult.extractResult(intent);
    if (activityRecognitionResult == null) {
      return;
    }

    //process the result here, pass the data needed to the broadcast
    // e.g. you may want to use activityRecognitionResult.getMostProbableActivity(); instead
    final List<DetectedActivity>
        probableActivities =
        activityRecognitionResult.getProbableActivities();

    sendBroadcast(MainActivity.newBroadcastIntent(probableActivities));
  }
}

Зарегистрируйте службу в манифесте.

    <service
            android:name=".ActivityDetectionService"
            android:exported="false">
    </service>

Чтобы использовать API, вам нужно также добавить следующие элементы в манифест.

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>

<meta-data
                android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version" />

Чтобы вернуть данные в действие, я использовал BroadcastReceiver, созданный в onCreate

mBroadcastReceiver = new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {
    ...
  }
}

Зарегистрируйте и отмените регистрацию в onResume и onPause соответственно.

  @Override
  protected void onResume() {
    super.onResume();
    registerReceiver(mBroadcastReceiver, newBroadcastIntentFilter());
  }

  @Override
  protected void onPause() {
    super.onPause();
    unregisterReceiver(mBroadcastReceiver);
  }

Ответ 3

Я не знаком с google fit api, поэтому единственный совет, который я могу вам дать, - это внимательно проверить ваш код. Является
Integer.parseInt(val.toString())
возвращая правый int и может
FitnessActivities.getName()
равные "велосипедные", "ходячие", "in_vehicle" и т.д.

Как я могу видеть здесь: https://developers.google.com/fit/rest/v1/reference/activity-types

Езда на велосипеде, в автомобиле и ходьбе - 0, 1 и 7. Проверьте, например, что возвращает значение FitnessActivities.getName(0), а также проверяет, возвращается ли значение val в значениях или возвращается каждый раз.

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