// ------! 앱이 설치 안됐을 때 연결해주는 주소 !------
val providerPackageName = "com.google.android.apps.healthdata"
val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
추가적으로 저렇게 필요한 것들(걸음수, 칼로리 등)만 추가했는데, 본인이 원하는 데이터에 맞게, 헬스커넥트 어플에 들어가셔서 권한을 추가하면 됨다
삼성헬스 기본 설정
# 1 - 1 권한 설정
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
val mViewModel : MeasureViewModel by viewModels()
// ------! 추가해야하는 곳 !------
lateinit var requestPermissions : ActivityResultLauncher<Set<String>>
lateinit var healthConnectClient : HealthConnectClient
val endTime = LocalDateTime.now()
val startTime = LocalDateTime.now().minusDays(1)
val PERMISSIONS =
setOf(
HealthPermission.getReadPermission(HeartRateRecord::class),
HealthPermission.getWritePermission(HeartRateRecord::class),
HealthPermission.getReadPermission(StepsRecord::class),
HealthPermission.getWritePermission(StepsRecord::class),
HealthPermission.getWritePermission(TotalCaloriesBurnedRecord::class),
HealthPermission.getReadPermission(TotalCaloriesBurnedRecord::class),
)
일단 해당 Activity에서 권한 설정을 얻을 수 있게 PERMISSIONS를 추가
데이터를 가져올 시간대 범위를 설정합니다.
# 1 - 2 앱 설치 여부 확인
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
...
val providerPackageName = "com.google.android.apps.healthdata"
val availabilityStatus = HealthConnectClient.getSdkStatus(this, providerPackageName )
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
return // 실행 가능한 통합이 없기 때문에 조기 복귀
}
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
// 선택적으로 패키지 설치 프로그램으로 리디렉션하여 공급자를 찾음.
val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
this.startActivity(
Intent(Intent.ACTION_VIEW).apply {
setPackage("com.android.vending")
data = Uri.parse(uriString)
putExtra("overlay", true)
putExtra("callerId", this)
}
)
return
}
healthConnectClient = HealthConnectClient.getOrCreate(this)
Log.v("현재 시간", "endTime: $endTime, startTime: $startTime")
// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()
requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
lifecycleScope.launch {
if (granted.containsAll(PERMISSIONS)) {
Log.v("PermissionO", "$healthConnectClient")
aggregateData(healthConnectClient)
} else {
Log.v("PermissionX", "$healthConnectClient")
checkPermissionsAndRun(healthConnectClient)
}
}
}
SdkStatus를 체크해서 앱이 미설치 상태일 경우, 플레이 스토어로 자동 연결됩니다.
그리고, 설치가 됐을 경우 헬스커넥트 앱에서 권한을 확인하고 데이터를 가져올 함수가 필요합니다
# 1 - 3 외부 앱 권한 설정 확인
private suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
val granted = healthConnectClient.permissionController.getGrantedPermissions()
if (granted.containsAll(PERMISSIONS)) {
// 권한 확인 후 aggregateData 함수 시작
aggregateData(healthConnectClient)
} else {
requestPermissions.launch(PERMISSIONS)
}
}
# 1 - 4 권한 확인 후 , HealthConnectClient에서 사용할 기능을 담은 함수 만들기
private suspend fun aggregateData(healthConnectClient: HealthConnectClient) {
// (선택) Instant로 변환해서 시간 범위 설정
val startTimeInstant = startTime.atZone(ZoneId.of("Asia/Seoul")).toInstant()
val endTimeInstant = endTime.atZone(ZoneId.of("Asia/Seoul")).toInstant()
// 30분단위 걸음 수 집계 (엉터리로 가져와 짐..), 총 걸음수 , 총 칼로리
aggregateStepsInto3oMins(healthConnectClient, startTime, endTime)
readStepsByTimeRange(healthConnectClient, startTimeInstant, endTimeInstant)
readCaloryByTimeRange(healthConnectClient, startTimeInstant, endTimeInstant)
}