Samsung Health · Data SDK

스마트폰 속 삼성 헬스 데이터를
내 앱에서 활용하기

걸음 수, 심박수, 수면, 혈압… 사용자의 갤럭시 워치·링·폰에 쌓인 건강 데이터를 안전하게 읽고 쓸 수 있게 해주는 공식 개발 도구, Samsung Health Data SDK를 한눈에 정리합니다.

📱 스마트폰 로컬 데이터 접근 🔒 Knox 기반 보안 ⌚ 갤럭시 워치 · 링 연동 🧩 Kotlin · 코루틴 API
Chapter 1

Data SDK란 무엇인가?

삼성 헬스 Data SDK는 스마트폰에 저장되어 있는 삼성 헬스 데이터를 다른 앱에서 사용할 수 있도록 제공하는 SDK입니다.

사용자의 갤럭시 워치·갤럭시 링·스마트폰 센서가 측정한 건강 데이터는 삼성 헬스 앱의 암호화된 저장소(Health Data Store)에 모입니다. Data SDK는 이 "기기 안(on-device)"에 저장된 데이터에 사용자 동의를 받아 접근하는 통로 역할을 합니다. 즉, 서버 API가 아니라 스마트폰 로컬 데이터를 직접 읽고 쓰는 방식입니다.

🗄️

로컬 데이터 접근

네트워크 서버가 아닌 사용자 기기에 저장된 삼성 헬스 데이터에 직접 접근합니다.

웨어러블 통합

갤럭시 워치·링·헬스 액세서리에서 측정된 풍부한 데이터를 하나로 모아 활용합니다.

🧑‍💻

직관적 Kotlin API

필터링·집계 기능이 내장되어 적은 코드로 원하는 데이터만 간편하게 조회합니다.

💡 이름 구분: 구버전의 이름은 Samsung Health SDK for Android, 신버전의 이름은 Samsung Health Data SDK입니다. 이 강의는 신버전(Samsung Health Data SDK)의 내용만 다룹니다.
Chapter 2

왜 Data SDK를 사용할까?

삼성이 공식적으로 내세우는 세 가지 핵심 가치입니다.

📊

신뢰성 있는 풍부한 데이터

스마트폰 센서와 갤럭시 웨어러블이 측정한 활동·휴식·건강관리 데이터를 폭넓게 제공합니다.

높은 생산성

필터링으로 필요한 데이터만 조회하고, 강력한 집계 기능으로 복잡한 후처리 없이 요약값을 얻습니다.

🛡️

보안과 프라이버시

삼성 Knox 보안 계층과 사용자 권한·SDK 정책에 따른 엄격한 접근 제어가 적용됩니다.

21
읽기 가능 데이터 항목
12
쓰기 가능 데이터 항목
25
제공 데이터 타입(종)
v1.1.0
SDK 최신 버전
Chapter 3

시작 전 요구사항

Data SDK를 사용하려면 아래 환경이 갖춰져야 합니다.

항목요구 사항
삼성 헬스 앱v6.30.2 이상 설치 (사용자 기기)
AndroidAndroid 10 (API 레벨 29) 이상
개발 언어Java 17 이상 / Kotlin
테스트 환경실제 기기 필요 — 에뮬레이터 미지원
SDK 라이브러리samsung-health-data-api-1.1.0.aar
⚠️ 주의: 삼성 헬스 데이터는 기기 안에만 존재하므로, 데이터가 실제로 쌓여 있는 실제 갤럭시 단말에서만 테스트할 수 있습니다. 에뮬레이터에서는 동작하지 않습니다.
Chapter 4 · 가장 중요한 부분

Samsung Health Data SDK로 얻을 수 있는 데이터

신규 Samsung Health Data SDK25종의 데이터 타입을 DataTypes로 제공합니다. 아래는 6개 카테고리로 정리한 실제 지원 타입이며, 각 타입의 읽기·쓰기 지원 여부를 색으로 표시했습니다.

R · 읽기(Read) W · 쓰기(Insert·Update·Delete) · "목표(Goal)·요약·점수·프로필" 타입은 읽기 전용입니다
🏃

Activity · 활동

움직임 · 운동
걸음 수StepsType
R
걸음 수 목표StepsGoalType
R
운동ExerciseType · 종류·시간·칼로리
RW
운동 위치ExerciseLocationType · 운동 경로
R
오른 층수FloorsClimbedType
RW
활동 요약ActivitySummaryType
R
활동 칼로리 목표ActiveCaloriesBurnedGoalType
R
활동 시간 목표ActiveTimeGoalType
R
😴

Rest · 휴식

수면
수면SleepType · 단계 정보 통합
RW
수면 목표SleepGoalType
R
수면 무호흡SleepApneaType
R
🍽️

Food · 식음료

섭취
영양NutritionType · 식사·칼로리·영양소
RW
영양 목표NutritionGoalType
R
수분 섭취WaterIntakeType
RW
수분 섭취 목표WaterIntakeGoalType
R
❤️

Health Care · 건강관리

바이탈 · 측정
심박수HeartRateType
RW
불규칙 심장 리듬 알림IrregularHeartRhythmNotificationType
R
혈압BloodPressureType
RW
혈당BloodGlucoseType
RW
혈중 산소BloodOxygenType · 산소포화도
RW
체온BodyTemperatureType
RW
피부 온도SkinTemperatureType
RW
체성분BodyCompositionType · 체중·체지방 등
RW

Score · 점수

에너지 점수EnergyScoreType · 컨디션 점수
R
👤

User Profile · 사용자

사용자 프로필UserProfileDataType · 성별·생년 등
R
📌 공통 속성: 모든 데이터 포인트는 UUID, CREATED_TIME, UPDATED_TIME, PACKAGE_NAME(측정 앱), DEVICE_UUID(측정 기기)를 기본으로 포함합니다. "어떤 앱·기기가 언제 측정했는지" 출처를 항상 알 수 있습니다.
⚠️ Data SDK에서 지원하지 않는 타입: 구버전 Samsung Health SDK for Android에 있던 카페인 섭취·당화혈색소(HbA1c)·자외선(UV)·주변 온·습도·건강 문서(Health Document) 등은 신규 Samsung Health Data SDK에서 제공하지 않습니다. 또한 수면 단계는 별도 타입이 아니라 SleepType에 통합되었고, 체중·키BodyCompositionType·UserProfileDataType에 포함됩니다.
Chapter 5

권한 모델 — 사용자 동의가 핵심

건강 데이터는 민감 정보이므로, 앱은 데이터 타입별 + 접근 종류별로 권한을 따로 요청해야 합니다. 권한 단위는 Permission.of(데이터타입, 접근종류) 형태입니다.

접근 종류 (AccessType)설명
READ해당 데이터 타입을 읽을 수 있는 권한
WRITE해당 데이터 타입을 삽입·수정·삭제할 수 있는 권한
권한 정의 예시
object Permissions {
    val PERMISSIONS = setOf<Permission>(
        Permission.of(DataTypes.STEPS,      AccessType.READ),
        Permission.of(DataTypes.STEPS_GOAL, AccessType.READ),
        Permission.of(DataTypes.HEART_RATE, AccessType.READ)
    )
}
흐름: 권한 요청 → 사용자가 삼성 헬스 동의 화면에서 허용 → 앱은 getGrantedPermissions()로 실제 승인 여부를 확인한 뒤 데이터에 접근합니다. 사용자는 언제든 일부 권한만 허용할 수 있으므로 항상 승인 여부를 재확인해야 합니다.
Chapter 6

핵심 구성요소

Data SDK를 다룰 때 꼭 알아야 할 클래스들입니다.

HealthDataStore

모든 데이터 작업의 진입점. HealthDataService.getStore(context)로 얻으며, 읽기·쓰기·집계·권한 요청을 수행합니다.

DataTypes

걸음 수·심박수 등 데이터 타입 정의 모음. 각 타입에서 요청 빌더(readDataRequestBuilder 등)를 꺼냅니다.

Permission / AccessType

데이터 타입별 읽기·쓰기 권한을 표현하는 단위입니다.

LocalTimeFilter / InstantTimeFilter

조회할 기간(시간 범위)을 지정하는 필터입니다.

ReadSourceFilter

특정 기기(워치·로컬 폰)나 측정 앱으로 데이터 출처를 좁히는 필터입니다.

DataPoint

읽어온 결과의 한 건. 측정값과 함께 데이터 ID·출처(앱/기기) 정보를 담습니다.

Chapter 7

데이터 연산 5종

Data SDK가 제공하는 작업(operation)입니다. 데이터 타입마다 지원하는 연산이 다릅니다.

📖 Read (읽기)

기본 쿼리로 데이터 집합을 가져옵니다. readDataRequestBuilder로 기간·정렬·개수·출처를 지정합니다.

🧮 Aggregate (집계)

요약값을 바로 얻습니다. TOTAL·LAST·MIN·MAX 등의 연산을 지원합니다.

➕ Insert / ✏️ Update / 🗑️ Delete

데이터를 삽입·수정·삭제합니다. 각각 insert/update/deleteDataRequestBuilder를 사용합니다.

🔗 Read Associated / 🔄 Query Changes

연관 데이터를 함께 읽거나, 마지막 조회 이후 변경분만 추적합니다.

Chapter 8

사용 흐름 5단계

실제 앱에서 데이터를 활용하기까지의 전체 과정입니다.

SDK 추가 & Store 생성

.aar 라이브러리를 추가하고 HealthDataService.getStore(context)HealthDataStore를 얻습니다.

권한 요청

requestPermissions(PERMISSIONS, activity)를 호출해 사용자 동의를 받습니다.

권한 확인

getGrantedPermissions()로 실제 승인된 권한을 확인합니다.

요청 빌드 & 실행

데이터 타입의 요청 빌더로 기간·필터를 설정해 readData()/aggregateData()를 호출합니다.

결과 활용

반환된 dataList의 각 DataPoint에서 값을 꺼내 화면에 표시·분석합니다.

Chapter 9

실전 코드 예제

① Gradle 의존성

// app/libs 폴더에 samsung-health-data-api-1.1.0.aar 추가 후
dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))
    implementation(libs.gson)
}

② Store 생성 & 권한 요청

val healthDataStore = HealthDataService.getStore(applicationContext)

// 권한 요청 (사용자 동의 화면 표시)
healthDataStore.requestPermissions(Permissions.PERMISSIONS, activity)

// 실제 승인된 권한 확인
val granted = healthDataStore.getGrantedPermissions(Permissions.PERMISSIONS)
if (granted.containsAll(Permissions.PERMISSIONS)) {
    // 데이터 접근 가능
}

③ 심박수 읽기 (기간 필터)

suspend fun readHeartRate(start: LocalDateTime, end: LocalDateTime) {
    val store = HealthDataService.getStore(applicationContext)
    val timeFilter = LocalTimeFilter.of(start, end)

    val request = DataTypes.HEART_RATE.readDataRequestBuilder
        .setLocalTimeFilter(timeFilter)
        .setOrdering(Ordering.DESC)
        .build()

    val heartRateList = store.readData(request).dataList
    heartRateList.forEach { point -> /* point 값 사용 */ }
}

④ 특정 기기 데이터만 조회 (출처 필터)

// 갤럭시 워치가 측정한 데이터만
val request = DataTypes.HEART_RATE.readDataRequestBuilder
    .setSourceFilter(ReadSourceFilter.fromDeviceType(DeviceGroup.WATCH))
    .setLocalTimeFilter(timeFilter)
    .setOrdering(Ordering.ASC)
    .build()

// 또는 현재 스마트폰(로컬 기기)이 측정한 데이터만
// .setSourceFilter(ReadSourceFilter.fromLocalDevice())

⑤ 걸음 수 집계 (TOTAL)

val result = healthDataStore.aggregateData(aggregateRequest)
var stepCount = 0L
result.dataList.forEach { aggregated ->
    aggregated.value?.let { stepCount = it }   // 기간 내 총 걸음 수 합산
}
🧪 직접 해보기: 삼성 개발자 사이트의 Code Lab에서 걸음 수(Steps)수면(Sleep) 데이터 활용 실습을 제공합니다. 실제 갤럭시 단말과 v1.1.0 SDK로 따라 해볼 수 있습니다.
Chapter 10

참고 자료

아래는 본 강의 자료의 출처이자, 더 깊이 학습할 수 있는 공식 문서 링크입니다.