Java 如何在android中从Google Fit服务检索健康数据

Java 如何在android中从Google Fit服务检索健康数据,java,android,google-api,google-fit,Java,Android,Google Api,Google Fit,我正在编写一个Android程序来检索特定类型的健康数据。我阅读谷歌文档从用户那里检索数据,但最后无法检索。任何人都可以用最简单的java方法来帮助解决这个问题。我的当前代码随附于此 public class MainActivity extends AppCompatActivity { int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = 156; GoogleSignInAccount googleSignInAccount=null; //Request

我正在编写一个Android程序来检索特定类型的健康数据。我阅读谷歌文档从用户那里检索数据,但最后无法检索。任何人都可以用最简单的java方法来帮助解决这个问题。我的当前代码随附于此

public class MainActivity extends AppCompatActivity {

int GOOGLE_FIT_PERMISSIONS_REQUEST_CODE = 156;
GoogleSignInAccount googleSignInAccount=null;

//Request Data for STEP_COUNT_DELTA with READ permissions
//FitnessOptions - API
FitnessOptions fitnessOptions = FitnessOptions.builder()
        .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
        .build();

@Override
protected void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);




    //Get instance of Google Account
     googleSignInAccount = googleSignInAccount(fitnessOptions);


    if (!GoogleSignIn.hasPermissions(googleSignInAccount, fitnessOptions)) {
        GoogleSignIn.requestPermissions(
                this, // your activity
                GOOGLE_FIT_PERMISSIONS_REQUEST_CODE, // e.g. 1
                googleSignInAccount,
                fitnessOptions);
    } else {

            accessGoogleFit();

    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == GOOGLE_FIT_PERMISSIONS_REQUEST_CODE) {

            accessGoogleFit();
        }
    }
}

private void accessGoogleFit() {

    Calendar cal = Calendar.getInstance();
    Date date = new Date();
    cal.setTime(date);

    long endTime = cal.getTimeInMillis();
    cal.add(Calendar.WEEK_OF_YEAR, -1);
    long startTime = cal.getTimeInMillis();

    //SessionReadRequest sessionReadRequest = new SessionReadRequest.Builder().read(DataType.AGGREGATE_ACTIVITY_SUMMARY).setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS).build();

    DataReadRequest dataReadRequest = new DataReadRequest.Builder().read(DataType.AGGREGATE_ACTIVITY_SUMMARY).setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS).build();

    Fitness.getHistoryClient(this, GoogleSignIn.getLastSignedInAccount(this)).readData(dataReadRequest)
            .addOnSuccessListener(new OnSuccessListener<DataReadResponse>() {
                @Override
                public void onSuccess(DataReadResponse dataReadResponse) {

                    List<DataSet> dataSets = dataReadResponse.getDataSets();
                    for(DataSet dataSet: dataSets){
                        for(Field field: dataSet.getDataType().getFields()){
                            if(field.getName().equalsIgnoreCase(FitnessActivities.SLEEP)){
                                Toast.makeText(MainActivity.this, "ENCONTRADO", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                }
            });

}





public GoogleSignInAccount googleSignInAccount(FitnessOptions fitnessOptions) {
    GoogleSignInAccount account = GoogleSignIn.getAccountForExtension(this, fitnessOptions);
    return account;
}
}
public类MainActivity扩展了AppCompatActivity{
int GOOGLE\u FIT\u PERMISSIONS\u REQUEST\u CODE=156;
GoogleSignInAccount GoogleSignInAccount=null;
//请求具有读取权限的步骤计数增量数据
//适用性选项-API
FitnessOptions FitnessOptions=FitnessOptions.builder()
.addDataType(DataType.TYPE\步骤\计数\增量,FitnessOptions.ACCESS\读取)
.build();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取Google帐户的实例
googleSignInAccount=googleSignInAccount(fitnessOptions);
如果(!GoogleSignIn.hasPermissions(googleSignInAccount,fitnessOptions)){
GoogleSignIn.requestPermissions(
这是你的活动
GOOGLE\u FIT\u权限\u请求\u代码,//例如1
谷歌公司,
适合性(可选);
}否则{
accessGoogleFit();
}
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
if(resultCode==Activity.RESULT\u确定){
if(requestCode==GOOGLE\u FIT\u PERMISSIONS\u REQUEST\u CODE){
accessGoogleFit();
}
}
}
私有void accessGoogleFit(){
Calendar cal=Calendar.getInstance();
日期=新日期();
校准设定时间(日期);
long-endTime=cal.getTimeInMillis();
cal.add(日历周,每年,-1);
long startTime=cal.getTimeInMillis();
//SessionReadRequest SessionReadRequest=new SessionReadRequest.Builder().read(DataType.AGGREGATE\u ACTIVITY\u SUMMARY).setTimeInterval(开始时间、结束时间、时间单位.毫秒).build();
DataReadRequest DataReadRequest=new DataReadRequest.Builder().read(DataType.AGGREGATE\u ACTIVITY\u SUMMARY).setTimeRange(开始时间、结束时间、时间单位.毫秒).build();
Fitness.getHistoryClient(this,GoogleSignIn.GetLastSignedAccount(this)).readData(dataReadRequest)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(DataReadResponse DataReadResponse){
List dataSets=dataReadResponse.getDataSets();
用于(数据集:数据集){
对于(字段:dataSet.getDataType().getFields()){
if(field.getName().equalsIgnoreCase(FitnessActivities.SLEEP)){
Toast.makeText(MainActivity.this,“ENCONTRADO”,Toast.LENGTH_LONG.show();
}
}
}
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
}
});
}
公共谷歌签名账号谷歌签名账号(FitnessOptions FitnessOptions){
GoogleSignanAccount account=GoogleSignIn.getAccountForExtension(这是fitnessOptions);
返回帐户;
}
}

通过此代码在访问google fit-api之前将google身份验证与用户存档,在accessGooogleFit()函数中实现的所有api访问

此代码片段来自google api文档

SessionReadRequest request = new SessionReadRequest.Builder()
        .readSessionsFromAllApps()
        // Activity segment data is required for details of the fine-
        // granularity sleep, if it is present.
        .read(DataType.TYPE_ACTIVITY_SEGMENT)
        .setTimeInterval(1576690819, 1576750401, TimeUnit.SECONDS)
        .build();

Task<SessionReadResponse> task = sessionClient.readSession(request);

task.addOnSuccessListener(response -> {
    // Filter the resulting list of sessions to just those that are sleep.
    List<Session> sleepSessions = response.getSessions().stream()
            .filter(s -> s.getActivity().equals(FitnessActivities.SLEEP))
            .collect(Collectors.toList());

    for (Session session : sleepSessions) {
        Log.d("AppName", String.format("Sleep between %d and %d",
                session.getStartTime(TimeUnit.SECONDS),
                session.getEndTime(TimeUnit.SECONDS)));

        // If the sleep session has finer granularity sub-components, extract them:
        List<DataSet> dataSets = response.getDataSet(session);
        for (DataSet dataSet : dataSets) {
            for (DataPoint point : dataSet.getDataPoints()) {
                // The Activity defines whether this segment is light, deep, REM or awake.
                String sleepStage = point.getValue(Field.FIELD_ACTIVITY).asActivity();
                long start = point.getStartTime(TimeUnit.SECONDS);
                long end = point.getEndTime(TimeUnit.SECONDS);
                Log.d("AppName",
                        String.format("\t* %s between %d and %d", sleepStage, start, end));
            }
        }
    }
});
SessionReadRequest request=newsessionreadrequest.Builder()
.readSessionsFromAllApps()
//罚款详情需要活动段数据-
//粒度睡眠,如果有。
.read(数据类型.类型\活动\段)
.setTimeInterval(15766908191576750401,时间单位为秒)
.build();
Task=sessionClient.readSession(请求);
task.addOnSuccessListener(响应->{
//将生成的会话列表筛选为仅处于睡眠状态的会话。
List sleepSessions=response.getSessions().stream()
.filter(s->s.getActivity().equals(FitnessActivities.SLEEP))
.collect(Collectors.toList());
用于(会话:睡眠会话){
Log.d(“AppName”,String.format(“在%d和%d之间睡眠”),
session.getStartTime(时间单位:秒),
getEndTime(TimeUnit.SECONDS));
//如果睡眠会话具有更细粒度的子组件,请提取它们:
列表数据集=response.getDataSet(会话);
用于(数据集:数据集){
对于(数据点:dataSet.getDataPoints()){
//该活动定义该部分是浅、深、REM还是清醒。
String sleepStage=point.getValue(Field.Field_ACTIVITY).asActivity();
长启动=point.getStartTime(时间单位:秒);
long end=point.getEndTime(时间单位:秒);
Log.d(“AppName”,
格式(“\t*%s介于%d和%d之间”,sleepStage,start,end));
}
}
}
});

这看起来像:请不要重新发布问题。好了!,谢谢你的帮助request@HirunRashmitha在你第一次提问后两天再问另一个问题,然后删除你的第一个问题,这与这里的工作方式无关。如果你的第一个问题没有得到答案,那么在两天内不要再打开另一个问题。您当前的代码有什么问题尚不清楚。@DaImTo谢谢您的建议,我是新来的。一切都是从你的语言中学到的^^谢谢,但这段代码没有提供预期的返回结果。您可以添加文档链接吗?这是您问题的答案吗?