본문 바로가기
Digital Healthcare/SAMSUNG

[Samsung Health SDK] Health Data

by goatlab 2022. 8. 8.
728x90
반응형
SMALL

Health Data

 

Samsung Health의 파트너 앱을 개발하기 위한 기본 사항을 설명한다. 먼저, 삼성 헬스의 파트너 앱 개발 환경을 참고하면 된다.

 

라이브러리 가져오기

 

생성한 애플리케이션 프로젝트의 "libs" 폴더에 다음 라이브러리를 추가한다.

 

samsung-health-data-a.b.c.aar

 

건강 데이터 저장소 연결

 

<queries>앱 manifest에 요소를 추가한다.

 

<manifest . . . >
    <queries>
        <package android:name="com.sec.android.app.shealth" />
    </queries> 
</manifest>

 

HealthDataStore를 사용하여 건강 데이터 저장소에 연결한다.

 
public class MainActivity extends Activity {
            public static final String APP_TAG = "SimpleHealth";
        
            private static MainActivity mInstance = null;
            private HealthDataStore mStore;
            private HealthConnectionErrorResult mConnError;
            private Set<PermissionKey> mKeySet;
        
            @Override
            public void onCreate(Bundle savedInstanceState) {
                // ...
        
                mInstance = this;
                mKeySet = new HashSet<PermissionKey>();
                mKeySet.add(new PermissionKey(HealthConstants.StepCount.HEALTH_DATA_TYPE, PermissionType.READ));
                // Create a HealthDataStore instance and set its listener
                mStore = new HealthDataStore(this, mConnectionListener);
                // Request the connection to the health data store
                mStore.connectService();
            }

 

활동이 삭제되면 상태 데이터 저장소 연결을 종료할 수 있다.

 

@Override
            public void onDestroy() {
                mStore.disconnectService();
                super.onDestroy();
            }

 

연결 결과가 HealthDataStore.ConnectionListener로 전송된다. 성공하면 데이터 권한을 얻거나 데이터를 쿼리할 수 있다.

 

private final HealthDataStore.ConnectionListener mConnectionListener = new HealthDataStore.ConnectionListener() {

            @Override
            public void onConnected() {
                Log.d(APP_TAG, "Health data service is connected.");
                HealthPermissionManager pmsManager = new HealthPermissionManager(mStore);
    
                try {
                    // Check whether the permissions that this application needs are acquired
                    // Request the permission for reading step counts if it is not acquired
    
                    // Get the current step count and display it if data permission is required
                    // ...
                } catch (Exception e) {
                    Log.e(APP_TAG, e.getClass().getName() + " - " + e.getMessage());
                    Log.e(APP_TAG, "Permission setting fails.");
                }
            }
    
            @Override
            public void onConnectionFailed(HealthConnectionErrorResult error) {
                Log.d(APP_TAG, "Health data service is not available.");
                showConnectionFailureDialog(error);
            }
    
            @Override
            public void onDisconnected() {
                Log.d(APP_TAG, "Health data service is disconnected.");
            }
        };

 

상태 데이터 저장소에 대한 연결이 실패할 수 있으며 onConnectionFailed()를 통해 오류 결과를 확인할 수 있다. 오류가 있는 경우 애플리케이션은 상태 프레임워크가 솔루션을 제공하는지 확인 hasResolution()하고 resolve()를 호출한다.

 

상태 프레임워크가 솔루션을 제공하는 경우, resolve()는 대화 상자 메시지 없이 애플리케이션을 다음 페이지 중 하나로 이동한다.

 

  • 앱마켓의 Samsung Health 페이지에서 설치 또는 업데이트
  • Samsung Health 를 사용할 수 있도록 하는 장치의 설정 페이지
  • 삼성헬스 이용약관 페이지

 

응용 프로그램은 각 오류 사례 및 호출에 대해 적절한 resolve() 메시지를 표시해야 한다.

 
private void showConnectionFailureDialog(HealthConnectionErrorResult error) {
                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                mConnError = error;
                String message = "Connection with Samsung Health is not available";
        
                if (mConnError.hasResolution()) {
                    switch(error.getErrorCode()) {
                    case HealthConnectionErrorResult.PLATFORM_NOT_INSTALLED:
                        message = "Please install Samsung Health";
                        break;
                    case HealthConnectionErrorResult.OLD_VERSION_PLATFORM:
                        message = "Please upgrade Samsung Health";
                        break;
                    case HealthConnectionErrorResult.PLATFORM_DISABLED:
                        message = "Please enable Samsung Health";
                        break;
                    case HealthConnectionErrorResult.USER_AGREEMENT_NEEDED:
                        message = "Please agree with Samsung Health policy";
                        break;
                    default:
                        message = "Please make Samsung Health available";
                        break;
                    }
                }
        
                alert.setMessage(message);
        
                alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        if (mConnError.hasResolution()) {
                            mConnError.resolve(mInstance);
                        }
                    }
                });
        
                if (error.hasResolution()) {
                    alert.setNegativeButton("Cancel", null);
                }
        
                alert.show();
            }

 

권한 요청

 

manifest의 필수 데이터 권한 값에 대한 메타 데이터 요소는 권한 요청 API와 함께 작동한다. 걸음 수 읽기에 대한 데이터 권한을 요청하려면 다음 예제와 같이 애플리케이션 프로젝트의 manifest에 해당 값을 작성한다.

 

<application
            <meta-data
                android:name="com.samsung.android.health.permission.read"
                android:value="com.samsung.health.step_count" />
        </application>

 

권한 키 세트를 생성하고 걸음 수 읽기를 위한 권한 키를 추가한다.

 

public class MainActivity extends Activity {
            private Set<PermissionKey> mKeySet;
        
            @Override
            public void onCreate(Bundle savedInstanceState) {
                // ...
        
                mKeySet = new HashSet<PermissionKey>();
                mKeySet.add(new PermissionKey(HealthConstants.StepCount.HEALTH_DATA_TYPE, PermissionType.READ));
        
                // connect to health data store
            }

 

그리고 HealthPermissionManager.requestPermissions()를 listener와 함께 호출한다.

 

private final HealthDataStore.ConnectionListener mConnectionListener = new HealthDataStore.ConnectionListener() {
        
                @Override
                public void onConnected() {
                    Log.d(APP_TAG, "Health data service is connected.");
                    HealthPermissionManager pmsManager = new HealthPermissionManager(mStore);
        
                    try {
                        // Check whether the permissions that this application needs are acquired
                        Map<PermissionKey, Boolean> resultMap = pmsManager.isPermissionAcquired(mKeySet);
        
                        if (resultMap.containsValue(Boolean.FALSE)) {
                            // Request the permission for reading step counts if it is not acquired
                            pmsManager.requestPermissions(mKeySet, MainActivity.this).setResultListener(mPermissionListener);
                        } else {
                            // Get the current step count and display it
                            // ...
                        }
                    } catch (Exception e) {
                        Log.e(APP_TAG, e.getClass().getName() + " - " + e.getMessage());
                        Log.e(APP_TAG, "Permission setting fails.");
                    }
                }
                // ...
            };
 

성공적으로 호출 되면 requestPermissions() 권한 UI가 사용자에게 팝업된다.

 

 

사용자가 각 데이터 권한을 허용한 후 "DONE"을 선택하면 사용자의 권한 정보가 저장된다. 그리고 HealthResultHolder.ResultListener를 통해 받는다.

 

private final HealthResultHolder.ResultListener<PermissionResult> mPermissionListener =
                new HealthResultHolder.ResultListener<PermissionResult>() {
        
                @Override
                public void onResult(PermissionResult result) {
                    Log.d(APP_TAG, "Permission callback is received.");
                    Map<PermissionKey, Boolean> resultMap = result.getResultMap();
        
                    if (resultMap.containsValue(Boolean.FALSE)) {
                        // Requesting permission fails
                    } else {
                        // Get the current step count and display it
                    }
                }
            };
        }

 

https://developer.samsung.com/health/android/data/guide/hello-health-data.html

 

Health | Samsung Developers

The world runs on you.

developer.samsung.com

 

728x90
반응형
LIST

'Digital Healthcare > SAMSUNG' 카테고리의 다른 글

[Samsung Health SDK] Health Data Type  (0) 2022.08.08
[Samsung Health SDK] Health Data Store  (1) 2022.08.08
Samsung Health SDK  (0) 2022.08.08
Samsung Privileged Health SDK  (0) 2022.08.08
갤럭시 워치 (Galaxy Watch)  (0) 2022.06.29