为什么Google Fit API会不断返回空数据集?

在遵循Google Fit API教程的同时,我正在构建一个计步器应用程序,并且在成功连接到Google Fit API之后,要返回的步骤数据集始终为空。我查看了多个显示相同问题的stackoverflow页面,他们的解决方案没有帮助我,所以我再次询问是否我的代码中可能有错误。

这是我的代码:

import android.app.activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatactivity;
import android.view.Menu;
import android.view.MenuItem;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import lirik.myapplication.common.logger.Log;
import lirik.myapplication.common.logger.LogView;
import lirik.myapplication.common.logger.LogWrapper;
import lirik.myapplication.common.logger.MessageonlyLogFilter;
import com.google.android.gms.fitness.fitness;
import com.google.android.gms.fitness.fitnessOptions;
import com.google.android.gms.fitness.data.DataSet;
import com.google.android.gms.fitness.data.DataType;
import com.google.android.gms.fitness.data.Field;
import com.google.android.gms.fitness.request.DataReadRequest;
import com.google.android.gms.fitness.result.DataReadResponse;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;

import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;


/**
 * This sample demonstrates how to use the History API of the Google Fit platform to insert data,* query against existing data,and remove data. It also demonstrates how to authenticate a user
 * with Google Play Services and how to properly represent data in a {@link DataSet}.
 */
public class ShowactivityData extends AppCompatactivity {
    public static final String TAG = "StepCounter";
    private static final int REQUEST_OAUTH_REQUEST_CODE = 0x1001;
    fitnessOptions fitnessOptions = fitnessOptions.builder()
            .addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA,fitnessOptions.accESS_READ)
            .addDataType(DataType.TYPE_DISTANCE_DELTA,fitnessOptions.accESS_READ)
            .addDataType(DataType.TYPE_STEP_COUNT_DELTA,fitnessOptions.accESS_READ)
            .build();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_data);
        // This method sets up our custom logger,which will print all log messages to the device
        // screen,as well as to adb logcat.
        initializeLogging();


        if (!GoogleSignIn.hasPermissions(GoogleSignIn.getaccountForExtension(this,fitnessOptions),fitnessOptions)) {
            GoogleSignIn.requestPermissions(
                    this,REQUEST_OAUTH_REQUEST_CODE,GoogleSignIn.getaccountForExtension(this,fitnessOptions);
        } else {
            accessGoogleFit();
        }
    }

    @Override
    protected void onactivityResult(int requestCode,int resultCode,Intent data) {
        if (resultCode == activity.RESULT_OK) {
            if (requestCode == REQUEST_OAUTH_REQUEST_CODE) {
                accessGoogleFit();
            }
        }
    }

    /** Records step data by requesting a subscription to background step data. */
    private void accessGoogleFit() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        long endTime = cal.getTimeInmillis();
        cal.add(Calendar.WEEK_OF_YEAR,-1);
        long startTime = cal.getTimeInmillis();

        DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA,DataType.AGGREGATE_STEP_COUNT_DELTA)
//                .read(DataType.TYPE_STEP_COUNT_DELTA)
                .bucketByTime(8,TimeUnit.DAYS)
                .enableServerQueries()
                .setTimeRange(startTime,endTime,TimeUnit.MILLISECONDS)
                .build();

        fitness.getHistoryClient(
                this,GoogleSignIn.getLastSignedInaccount(this))
                .readData(readRequest)
                .addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
                    @Override
                    public void onSuccess(DataReadResponse dataReadResponse) {
                        Log.d("TAG_F","onSuccess: 1 " + dataReadResponse.toString());
                        Log.d("TAG_F","onSuccess: 1 " + dataReadResponse.getStatus());
                        Log.d("TAG_F","onSuccess: 1 " + dataReadResponse.getdataset(DataType.TYPE_STEP_COUNT_DELTA));
                        Log.d("TAG_F","onSuccess: 1 " + dataReadResponse.getBuckets().get(0));
                        Log.d("TAG_F","onSuccess: 1 " + dataReadResponse.getBuckets().get(0).getdatasets().size());

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.d("TAG_F","onFailure: 1 " + e.getMessage());
                    }
                })
                .addOnCompleteListener(new OnCompleteListener<DataReadResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<DataReadResponse> task) {
                        Log.d("TAG_F","onComplete: 1 ");
                    }
                });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the main; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.showactivity,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_read_data) {
            accessGoogleFit();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /** Initializes a custom log class that outputs both to in-app targets and logcat. */
    private void initializeLogging() {
        // Wraps Android's native log framework.
        LogWrapper logWrapper = new LogWrapper();
        // Using Log,front-end to the logging chain,emulates android.util.log method signatures.
        Log.setLogNode(logWrapper);
        // Filter strips out everything except the message text.
        MessageonlyLogFilter msgFilter = new MessageonlyLogFilter();
        logWrapper.setNext(msgFilter);
        // On screen logging via a customized TextView.
        LogView logView = (LogView) findViewById(R.id.sample_logview);

        // Fixing this lint error adds logic without benefit.
        // noinspection AndroidLintDeprecation
        logView.setTextAppearance(R.style.Log);

        logView.setBackgroundColor(Color.WHITE);
        msgFilter.setNext(logView);
        Log.i(TAG,"Ready");
    }
}

这是输出到手机上的东西:

Ready
onSuccess: 1
com.google.android.gms.fitness.result.DataReadResponse@c68f632
onSuccess: 1 Status{statusCode = SUCCESS,resolution=null}
onsuccess: 1 DataSet{d:step_count.delta:[]}
onSuccess: 1
Bucket{startTime=1572834266699,endTime=1573439066699,activity=4,dataSets = [DataSet{d:step_count_delta:gms:aggregated[]}],bucketType=time,serverHasMoreData=false}
onSuccess: 1 1
onComplete: 1

非常感谢您的帮助!

maochanggeng 回答:为什么Google Fit API会不断返回空数据集?

DataType.AGGREGATE_STEP_COUNT_DELTA和DataType.TYPE_STEP_COUNT_DELTA是两个不同的东西。

您正在请求AGGREGATE_STEP_COUNT_DELTA并阅读TYPE_STEP_COUNT_DELTA。它只会给出空结果。

本文链接:https://www.f2er.com/3126786.html

大家都在问