You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Fit睡眠数据获取异常:仅能获取会话列表无法获取数据集求助

解决Google Fit API无法获取睡眠数据集的问题

你能正常获取心率等数据但拿不到睡眠数据集,说明基础API授权和调用流程是通的,问题出在睡眠数据特有的权限、请求配置或读取逻辑上,以下是针对性修复方案:


1. 确认睡眠相关权限配置

Google Fit睡眠数据需要两个核心权限,缺一不可:

  • 在AndroidManifest.xml中添加声明:
    <uses-permission android:name="com.google.android.gms.permission.FITNESS_SLEEP_READ" />
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    
  • Android 10(API 29)及以上必须动态申请ACTIVITY_RECOGNITION权限,即使清单已声明,否则系统会静默拒绝睡眠数据访问请求。

2. 修正SessionReadRequest的DataType配置

你的请求仅指定了TYPE_SLEEP_SEGMENT,部分睡眠数据源可能需要同时读取TYPE_SLEEP_POINT,或者需要明确关联会话与数据类型。修改请求构建代码:

SessionReadRequest request = new SessionReadRequest.Builder()
        .readSessionsFromAllApps()
        .includeSleepSessions()
        // 同时读取睡眠分段和睡眠点数据,覆盖不同数据源格式
        .read(DataType.TYPE_SLEEP_SEGMENT)
        .read(DataType.TYPE_SLEEP_POINT)
        .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
        .build();

3. 修复DataSet读取逻辑

原代码中sessionReadResponse.getDataSet(session)无法正确关联会话与数据类型,导致返回空数据集。推荐两种可靠的读取方式:

方式一:按数据类型直接获取所有数据集(更简洁)

@Override
public void onSuccess(SessionReadResponse sessionReadResponse) {
    // 直接获取所有睡眠分段数据
    DataSet sleepSegmentDataSet = sessionReadResponse.getDataSet(DataType.TYPE_SLEEP_SEGMENT);
    for (DataPoint point : sleepSegmentDataSet.getDataPoints()) {
        String sleepStage = String.valueOf(point.getValue(Field.FIELD_SLEEP_SEGMENT_TYPE).asInt());
        long start = point.getStartTime(TimeUnit.MILLISECONDS);
        long end = point.getEndTime(TimeUnit.MILLISECONDS);
        Log.i(TAG, "\t* 睡眠阶段 " + sleepStage + ": " + new Date(start) + " 至 " + new Date(end));
    }

    // 可选:读取睡眠点数据(部分数据源会提供)
    DataSet sleepPointDataSet = sessionReadResponse.getDataSet(DataType.TYPE_SLEEP_POINT);
    for (DataPoint point : sleepPointDataSet.getDataPoints()) {
        // 处理睡眠点数据...
    }
}

方式二:按会话+数据类型精准获取

@Override
public void onSuccess(SessionReadResponse sessionReadResponse) {
    for (Session session : sessionReadResponse.getSessions()) {
        // 明确指定数据类型,获取当前会话对应的睡眠数据集
        DataSet sleepDataSet = sessionReadResponse.getDataSet(session, DataType.TYPE_SLEEP_SEGMENT);
        if (!sleepDataSet.isEmpty()) {
            for (DataPoint point : sleepDataSet.getDataPoints()) {
                // 处理数据点逻辑...
            }
        }
    }
}

4. 调整时间范围覆盖完整睡眠周期

睡眠通常跨天(前一晚至次日清晨),原代码的“昨天此刻到今天此刻”范围可能截断跨天的睡眠会话。建议调整为覆盖完整自然日:

Calendar cal = Calendar.getInstance();
// 结束时间设为今日0点
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long endTime = cal.getTimeInMillis();
// 开始时间设为昨日0点
cal.add(Calendar.DAY_OF_MONTH, -1);
long startTime = cal.getTimeInMillis();

5. 添加错误监听排查隐性问题

原代码缺少错误回调,无法捕获API调用的隐性错误(如权限未通过、数据格式不兼容等),建议添加:

Fitness.getSessionsClient(requireContext(), getGoogleSigningAccount())
        .readSession(request)
        .addOnSuccessListener(...)
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e(TAG, "读取睡眠数据失败: ", e);
            }
        });

内容的提问来源于stack exchange,提问作者Mayur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:09:22