Получить текущую активность от 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]()
Ответы
Ответ 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 в значениях или возвращается каждый раз.
Если у вас есть проблемы с вашими кодами, вы должны знать, что делает код в любой строке, какие методы и функции возвращаются... Также сообщайте людям, чтобы они находили решения проще.