반응형

 

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

 

Data | SimpleHeath | Samsung Developer

The world runs on you.

developer.samsung.com

 

그리고 내 프로젝트의 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 만 호출한것.

 

참고 가이드 URL : https://developer.samsung.com/health/android/data/api-reference/com/samsung/android/sdk/healthdata/HealthPermissionManager.html

 

 

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 는 삼성 파트너쉽 앱 등록 후 사용하여야하는데 현재 서비스 리뉴얼중으로 (몇달간 계속되는듯..) 사용불가.

 

걸음수 가져가고싶으면 헬스 커넥트 앱을 사용하라는 답변!

후... 이거 다 지우고 헬스 커넥트 앱으로 재도전 ^^....

 

728x90

+ Recent posts