Search
🌆

11. 심박수 데이터 획득

삼성헬스 앱 연동 심박수 데이터 가져오기

출시되는 상품은 삼성에 요청하고 심사받아서 SDK를 바로 사용할 수는 있음
구글에서 만든 Health connect라는 중계 앱을 이용하여 관련 api를 사용해야함.

삼성헬스 결론 : 연동은 성공해도 데이터가 google Health connect로 Write가 잘안되는 현상

수정 방향 google fit사용

아래의 코드는 주요 반영사항입니다. 추가적으로 수정이 필요할 수 있습니다.
MainActivity 코틀린 파일 수정
경로
android/app/src/main/kotlin/com/example/프로젝트이름/MainActivity.kt
JavaScript
복사
내용
package com.example.프로젝트이름 import io.flutter.embedding.android.FlutterFragmentActivity class MainActivity: FlutterFragmentActivity() { }
JavaScript
복사
xxx_permissions.xml 파일 생성 및 수정
경로
android/app/src/main/res/xml/health_permissions.xml
JavaScript
복사
내용
<?xml version="1.0" encoding="utf-8"?> <permissions> <permission name="android.permission.health.READ_HEART_RATE"> <dataType name="heart_rate"> <access type="read" /> </dataType> </permission> <permission name="android.permission.health.READ_STEPS"> <dataType name="steps"> <access type="read" /> </dataType> </permission> <permission name="android.permission.health.READ_SLEEP"> <dataType name="sleep"> <access type="read" /> </dataType> </permission> <permission name="android.permission.health.READ_HEALTH_DATA_HISTORY"> <dataType name="heart_rate"> <access type="read" /> </dataType> <dataType name="steps"> <access type="read" /> </dataType> <dataType name="sleep"> <access type="read" /> </dataType> </permission> </permissions>
JavaScript
복사
권한설정
경로
android/app/src/main/AndroidManifest.xml
JavaScript
복사
내용
<!-- 활동 인식 및 센서 권한 --> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" /> <uses-permission android:name="android.permission.BODY_SENSORS" /> <uses-permission android:name="android.permission.BODY_SENSORS_BACKGROUND" /> <!-- Health Connect 권한 --> <uses-permission android:name="android.permission.health.READ_HEART_RATE"/> <uses-permission android:name="android.permission.health.READ_STEPS"/> <uses-permission android:name="android.permission.health.READ_SLEEP"/> <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_HISTORY"/> <!-- health 패키지에서 필요로 하는 기존 권한 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
JavaScript
복사
동일파일
<application android:label="프로젝트이름" android:name="${applicationName}" android:icon="@mipmap/ic_launcher"> <activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:taskAffinity="" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <!-- Specifies an Android theme to apply to this Activity as soon as the Android process has started. This theme is visible to the user while the Flutter UI initializes. After that, this theme continues to determine the Window background behind the Flutter UI. --> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" /> </intent-filter> </activity> <!-- Don't delete the meta-data below. This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> <meta-data android:name="flutterEmbedding" android:value="2" /> <!-- Health Connect 관련 메타데이터 --> <meta-data android:name="health_permissions" android:resource="@xml/health_permissions" /> </application>
JavaScript
복사
동일파일
<queries> <intent> <action android:name="android.intent.action.PROCESS_TEXT"/> <data android:mimeType="text/plain"/> </intent> <!-- Health Connect 관련 쿼리 --> <package android:name="com.google.android.apps.healthdata" /> <intent> <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" android:host="play.google.com" android:path="/store/apps/details" /> </intent> </queries>
JavaScript
복사
gradle-wrapper.properties
경로
android/gradle/wrapper/gradle-wrapper.properties
JavaScript
복사
내용
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
JavaScript
복사
settings.gradle
경로
android/settings.gradle
JavaScript
복사
내용
plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version "8.6.0" apply false id "org.jetbrains.kotlin.android" version "2.1.20" apply false }
JavaScript
복사
빌드 진행시 gradle 버전에 계속 변경되지 않으면 id "com.android.application" version "8.6.0" apply false 이부분 필수 확인
android.build.gradle
경로
android/build.gradle
JavaScript
복사
내용
buildscript { ext.kotlin_version = '1.9.20' // repositories 정의 추가 repositories { google() mavenCentral() } dependencies { classpath 'com.google.gms:google-services:4.4.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() mavenCentral() } }
JavaScript
복사
android/app/build.gradle
경로
android/app/build.gradle
JavaScript
복사
내용
plugins { id "com.android.application" id "kotlin-android" // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "프로젝트 id" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. // minSdk = flutter.minSdkVersion minSdk = 26 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName } dependencies { implementation("androidx.health.connect:connect-client:1.1.0-beta01") }
JavaScript
복사
pubspec.yaml
health: ^12.1.0 url_launcher: ^6.3.1 package_info_plus: ^8.3.0 external_app_launcher: ^4.0.3
JavaScript
복사
사용전 최신 버전 및 호환 확인
메모
gradle 버전 변경
./gradlew wrapper --gradle-version 8.9
JavaScript
복사
전체 클린
cd /path/to/your/project/android ./gradlew clean flutter clean flutter pub get
JavaScript
복사
gradlew clean은 최후에 수단이다. 잘되면 좋지만 몇번 진행해본 결과 관련된 캐시파일들이 깨져서 더이상 빌드가 되지 않는다 git 을 이용하여 버전관리를 잘하는게 좋다