Получить текущую активность от Google Fit API Android
Я работаю над демонстрационным приложением, чтобы получить Текущий образец активности с помощью Google Fit. Я могу правильно определить скорость и расстояние. Но он не очень часто возвращается в состояние "in_vehicle" или "biking", хотя я был в том же состоянии. Найдите прилагаемый скриншот для того же. Я получил скорость 59.40 км/ч(36.91 м / ч) и в то время он не возвращал "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";
}
}
}
}
спасибо.
3 ответов
Как вы сказали, все правильно скорость. Вы можете поместить customise код, написанный ниже.
if (strState.equals("Automotive") && speed == 0.00)
{
strState = "Not Moving";
}
else if (strState.equals("Not Moving") && speed > 5)
{
strState = "Automotive";
}
else
{
strState = "strState";
}
Это может быть неправильным, но это даст вам близлежащий результат состояния.
вы можете найти пример проекта, который я создал здесь.
https://github.com/cyfung/ActivityRecognitionSample
важное замечание: вы не можете получать данные так часто, как вы просили!
начиная с API 21, действия могут быть получены реже, чем параметр detectionIntervalMillis, если устройство находится в режиме энергосбережения режим и экран выключены.
ключ компоненты:
создать 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 connect). Использовать 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);
}
Я не знаком с API, поэтому единственный совет, который я могу вам дать, это тщательно проверить ваш код. Есть
Integer.parseInt(val.toString())
возврат правильного int и can
FitnessActivities.getName()
равные "велосипед", "ходьба"," in_vehicle " и т. д.
Как я вижу отсюда:https://developers.google.com/fit/rest/v1/reference/activity-types
езда на велосипеде, в автомобиле и ходьба 0, 1 и 7. Проверьте, что FitnessActivities.getName (0) возвращается для например, также проверьте, что val возвращает разные значения или каждый раз возвращается одно и то же.
Если у вас возникли проблемы с вашими кодами, вы должны знать, что код делает в любой строке, какие методы и функции возвращаются... Также информируйте людей, чтобы они легче находили решения.