public class HealthDataResolver extends Object
Health data can be accessed with following interfaces mainly.
HealthDataResolver.InsertRequest
HealthDataResolver.ReadRequest
HealthDataResolver.UpdateRequest
HealthDataResolver.DeleteRequest
HealthDataResolver.AggregateRequest
Handling a part of data is a common use case rather than accessing whole data for the health data type. The Health data framework provides a filter to specify the precise scope for health data and is able to access required data only.
HealthDataResolver.Filter
The asynchronous request is used normally for operations that take a time such as reading data with conditions. If you need to request asynchronously, set the result listener with HealthResultHolder.setResultListener(HealthResultHolder.ResultListener).
HealthResultHolder.setResultListener(HealthResultHolder.ResultListener)
public class HealthDataResolverExample { // The state of connection HealthDataStore mStore; public static final String APP_TAG = "MyApp"; public void readGlucoseAsynchronously(long startTime, long endTime) { HealthDataResolver resolver = new HealthDataResolver(mStore, null); HealthDataResolver.ReadRequest request = new HealthDataResolver.ReadRequest.Builder() .setDataType(HealthConstants.BloodGlucose.HEALTH_DATA_TYPE) .setLocalTimeRange(HealthConstants.BloodGlucose.START_TIME, HealthConstants.BloodGlucose.TIME_OFFSET, startTime, endTime) .build(); try { resolver.read(request).setResultListener(mRdResult); } catch (Exception e) { Log.d(APP_TAG, "Reading health data fails."); } } private final HealthResultHolder.ResultListener<HealthDataResolver.ReadResult> mRdResult = new HealthResultHolder.ResultListener<HealthDataResolver.ReadResult>(){ @Override public void onResult(HealthDataResolver.ReadResult result) { try { Iterator<HealthData> iterator = result.iterator(); if (iterator.hasNext()) { HealthData data = iterator.next(); float glucoseValue = data.getFloat(HealthConstants.BloodGlucose.GLUCOSE); } finally { result.close(); } }; }
Though asynchronous data request is used commonly, there is a way to get the query result synchronously with HealthResultHolder.await().
HealthResultHolder.await()
Note, not to make the synchronous request on the UI thread. HealthResultHolder.await() throws an exception if it is called on the main thread. It can hang your application caused by taking a time to handle the synchronous query.
public class HealthDataResolverExample { // The state of connection HealthDataStore mStore; public static final String APP_TAG = "MyApp"; public void readGlucoseSynchronously(long startTime, long endTime) { HealthDataResolver resolver = new HealthDataResolver(mStore, null); HealthDataResolver.ReadRequest request = new HealthDataResolver.ReadRequest.Builder() .setDataType(HealthConstants.BloodGlucose.HEALTH_DATA_TYPE) .setLocalTimeRange(HealthConstants.BloodGlucose.START_TIME, HealthConstants.BloodGlucose.TIME_OFFSET, startTime, endTime) .build(); try { // Checks the result immediately HealthDataResolver.ReadResult rdResult = resolver.read(request).await(); try { Iterator<HealthData> iterator = rdResult.iterator(); if (iterator.hasNext()) { HealthData data = iterator.next(); float glucoseValue = data.getFloat(HealthConstants.BloodGlucose.GLUCOSE); } finally { rdResult.close(); } } catch (Exception e) { Log.d(APP_TAG, "Reading health data fails."); } } }
Getting data permission is required after connection to the health data store to synchronize health data with Samsung Health. Samsung Health SDK for Android provides the data permission UI to get the user's consent. The user can agree to share health data with the application through the permission UI and the application can get required data permission Check HealthPermissionManager to use the permission UI.
HealthPermissionManager
If you try to read or write health data without permission, the SDK gives SecurityException.
SecurityException
Gaining the HealthConstants.HealthDocument type's permission is different with other data types. It is available by acquiring the instant permission. Instant permission is created for one-time data access. It is proper to handle very sensitive health data. The data type needs the instant permission is HealthConstants.HealthDocument. An app needs the instant permission whenever it accesses health document data.
HealthConstants.HealthDocument
HealthDataResolver.insertWithPermission()
HealthDataResolver.readWithPermission()
HealthDataResolver.deleteWithPermission()
HealthDataResolver
static interface
static class
HealthDataResolver.AggregateResult
HealthDataResolver.ReadResult
HealthDataResolver.SortOrder
HealthDataResolver(HealthDataStore store, Handler handler)
HealthResultHolder<HealthDataResolver.AggregateResult>
aggregate(HealthDataResolver.AggregateRequest request)
HealthResultHolder<HealthResultHolder.BaseResult>
delete(HealthDataResolver.DeleteRequest request)
deleteWithPermission(HealthDataResolver.DeleteRequest request, Activity activity)
insert(HealthDataResolver.InsertRequest request)
insertWithPermission(HealthDataResolver.InsertRequest request, Activity activity)
HealthResultHolder<HealthDataResolver.ReadResult>
read(HealthDataResolver.ReadRequest request)
readWithPermission(HealthDataResolver.ReadRequest request, Activity activity)
update(HealthDataResolver.UpdateRequest request)
public HealthDataResolver(HealthDataStore store, Handler handler)
store
handler
null
public HealthResultHolder<HealthResultHolder.BaseResult> insert(HealthDataResolver.InsertRequest request)
Check this request's result in HealthResultHolder.BaseResult.getStatus().
HealthResultHolder.BaseResult.getStatus()
request
HealthResultHolder
HealthResultHolder.BaseResult
IllegalArgumentException
IllegalStateException
public HealthResultHolder<HealthResultHolder.BaseResult> insertWithPermission(HealthDataResolver.InsertRequest request, Activity activity)
activity
public HealthResultHolder<HealthResultHolder.BaseResult> update(HealthDataResolver.UpdateRequest request)
Check this request's result through HealthResultHolder.BaseResult.getStatus().
public HealthResultHolder<HealthResultHolder.BaseResult> delete(HealthDataResolver.DeleteRequest request)
public HealthResultHolder<HealthResultHolder.BaseResult> deleteWithPermission(HealthDataResolver.DeleteRequest request, Activity activity)
public HealthResultHolder<HealthDataResolver.ReadResult> read(HealthDataResolver.ReadRequest request)
public HealthResultHolder<HealthDataResolver.ReadResult> readWithPermission(HealthDataResolver.ReadRequest request, Activity activity)
public HealthResultHolder<HealthDataResolver.AggregateResult> aggregate(HealthDataResolver.AggregateRequest request)