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()는 대화 상자 메시지 없이 애플리케이션을 다음 페이지 중 하나로 이동한다.
|
응용 프로그램은 각 오류 사례 및 호출에 대해 적절한 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
'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 |