Kotlin Native Android App 개발 중 걸음수가 필요해서 Samsung Health API 를 달려고 했는데
결론적으로는 Samsung partnership 등록이 필요했고, 현재로서는 더이상 받고있지않는다는 답변을 받았다.
질문 올렸던 URL : https://forum.developer.samsung.com/t/samsung-health-api-is-not-working-for-android-device/33200/2
하지만 작업한게 아까워서 기록용으로 남기려고한다.
이 모든것은 작동안되는 방법이므로 health connect 앱으로 작업하세요!!
1. SDK 다운로드
SDK 추가방법은 build.gradle 에 추가하거나 직접 파일추가하는 방법이 있다.
build.gradle 에 추가했을때 import가 되지 않아서 나는 아래 링크의 예제 프로젝트에서 받았다
(simplehealth\app\src\main\libs\samsung-health-data-1.5.0.aar)
https://developer.samsung.com/health/android/sample/simple-health.html
그리고 내 프로젝트의 libs에 넣고 build.gradle에 file 위치를 알려줬다.
/*Samsung sdk*/
implementation files('libs/samsung-health-data-1.5.0.aar')
2. AndroidManifest 수정
<manifest>
...
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--삼성 SDK-->
<queries>
<package android:name="com.sec.android.app.shealth" />
</queries>
<application
....
>
<!--삼성 SDK 권한-->
<meta-data android:name="com.samsung.android.health.permission.read"
android:value="com.samsung.health.step_count;com.samsung.shealth.step_daily_trend;com.samsung.health.exercise"/>
<activity
android:name=".ui.main.MainActivity"
...
/>
</application>
</manifest>
마지막 삼성 SDK 권한쪽 보면 value에 원하는 데이터를 콤마의 형태로 여러번 불러올수있다.
나는 읽기만 필요하니까 read 만 호출한것.
3. Samsnung Health API 연동
1) initDataStore 메소드에서 HealthDataStore 를 초기화시키고 실행
2) onConnected 에서 필요한 권한을 세팅하고 (이때 Manifest에서 설정한 권한과 동일해야함) 권한 request
3) 그러면 권한 입력하는 팝업이 호출됨
4) 권한 선택 여부가 mPermisionListener 로 들어옴
...
import com.samsung.android.sdk.healthdata.HealthConnectionErrorResult
import com.samsung.android.sdk.healthdata.HealthConstants
import com.samsung.android.sdk.healthdata.HealthConstants.Exercise
import com.samsung.android.sdk.healthdata.HealthConstants.StepDailyTrend
import com.samsung.android.sdk.healthdata.HealthDataResolver
import com.samsung.android.sdk.healthdata.HealthDataStore
import com.samsung.android.sdk.healthdata.HealthDataStore.ConnectionListener
import com.samsung.android.sdk.healthdata.HealthPermissionManager
import com.samsung.android.sdk.healthdata.HealthPermissionManager.PermissionKey
import com.samsung.android.sdk.healthdata.HealthPermissionManager.PermissionResult
import com.samsung.android.sdk.healthdata.HealthPermissionManager.PermissionType
import com.samsung.android.sdk.healthdata.HealthResultHolder
@AndroidEntryPoint
class HomeFragment : Fragment() {
private var TAG : String = "HOME FRAGMENT"
private lateinit var mStore: HealthDataStore
private lateinit var mKeySet: MutableSet<PermissionKey>
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//삼성 SDK 초기화
initDataStore()
}
/**
* 삼성 SDK 초기화
*/
private fun initDataStore() {
//activity 에서 실행한다면 requireContext 대신 this
mStore = HealthDataStore(requireContext(), mCntListener)
mStore.connectService()
}
/**
* 삼성 SDK Listener 설정
*/
private val mCntListener: ConnectionListener = object : ConnectionListener {
override fun onConnected() {
Log.d(TAG, "Health data service is connected.")
val mManager = HealthPermissionManager(mStore)
//내가 원하는 권한요청
mKeySet = HashSet()
mKeySet.add(PermissionKey(HealthConstants.StepCount.HEALTH_DATA_TYPE, PermissionType.READ))
mKeySet.add(PermissionKey(StepDailyTrend.HEALTH_DATA_TYPE, PermissionType.READ))
val resultMap : MutableMap<PermissionKey, Boolean> = mManager.isPermissionAcquired(mKeySet)
if(resultMap.containsValue(false)) { //만약 권한이 없다면 권한요청 UI 팝업
mManager.requestPermissions(mKeySet, requireActivity()).setResultListener(mPermissionListener)
} else {
binding.tvStepCountText.text = getStepCount().toString()
}
}
override fun onConnectionFailed(error: HealthConnectionErrorResult) {
//연결 실패 시 실행할 로직
}
override fun onDisconnected() {
mStore.disconnectService() // 연결종료
}
}
private val mPermissionListener = HealthResultHolder.ResultListener<PermissionResult> { result ->
Log.d(TAG, "Permission callback is received.")
val resultMap = result.resultMap
if (resultMap.containsValue(false)) {
Log.d(TAG, "Permission false")
} else {
binding.tvStepCountText.text = getStepCount().toString()
}
}
private fun getStepCount() : Int{
var stepCount = 0;
val resolver = HealthDataResolver(mStore, null)
val request = HealthDataResolver.ReadRequest.Builder()
.setDataType(HwConstants.DATA_TYPE_STEP_COUNT)
.build()
resolver.read(request).setResultListener { result ->
val iterator = result.iterator()
while (iterator.hasNext()) {
val data = iterator.next()
stepCount = data.getInt("count")
}
result.close()
}
return stepCount
}
}
나의 경우 3번을 진행하다가 아무리해도 권한체크하는 영역이 노출되지않아서 문의를 했었다.
모든권한 하단에 내가 요청한 권한목록이 떴어야 했는데...
결론적으로는 해당 API 는 삼성 파트너쉽 앱 등록 후 사용하여야하는데 현재 서비스 리뉴얼중으로 (몇달간 계속되는듯..) 사용불가.
걸음수 가져가고싶으면 헬스 커넥트 앱을 사용하라는 답변!
후... 이거 다 지우고 헬스 커넥트 앱으로 재도전 ^^....
'Mobile > Android' 카테고리의 다른 글
Health Connect API 연결하기 (Kotlin Android Native app) (5) | 2024.07.16 |
---|---|
안드로이드 스튜디오 the environment variable java_home does not point to a valid jvm installation androidstudio (0) | 2024.06.28 |
Kotlin - Android 빈 화면 터치 시 키보드 숨김 (0) | 2024.04.09 |
Kotlin - Android Navigation Component 사용과 Fragment 이동 (0) | 2024.04.09 |
<data> 태그 사용법 (0) | 2024.04.02 |