public class HealthPermissionManager extends Object
HealthConstants.HealthDocument
An application can access health data only if the user consents. Permission for data access can be requested by each data type and the permission type (read or write).
public class MainActivity extends Activity { // The state of connection private HealthDataStore mStore; Set<PermissionKey> mKeys = new HashSet<PermissionKey>(); private static final String APP_TAG = "MyApp"; public void requestPermission() { // Acquire permission HealthPermissionManager pmsManager = new HealthPermissionManager(mStore); mKeys.add(new PermissionKey(Exercise.HEALTH_DATA_TYPE, PermissionType.READ)); mKeys.add(new PermissionKey(Exercise.HEALTH_DATA_TYPE, PermissionType.WRITE)); mKeys.add(new PermissionKey(StepDailyTrend.HEALTH_DATA_TYPE, PermissionType.READ)); try { pmsManager.requestPermissions(mKeys, MainActivity.this).setResultListener(mPermissionListener); } catch (Exception e) { Log.d(APP_TAG, "requestPermissions() fails"); } }
requestPermissions()
PermissionResult
private final HealthResultHolder.ResultListener<PermissionResult> mPermissionListener = new HealthResultHolder.ResultListener<PermissionResult>() { @Override public void onResult(PermissionResult result) { Map<PermissionKey, Boolean> resultMap = result.getResultMap(); if (resultMap.values().contains(Boolean.FALSE)) { Log.d(APP_TAG, "All required permissions are not granted."); } else { Log.d(APP_TAG, "All required permissions are granted."); //Access health data } } }; }
Not only calling permission related APIs, but specifying permission in the manifest file is required. The declared permission items in the application's manifest are shown on "Samsung Health > Settings > Data permissions > [YourApp]".
Manifest below contains two data permissions to read and one data permission to write health data. Use the semicolon (;) to declare multiple data types.
<manifest . . . > <application . . . > <meta-data android:name="com.samsung.android.health.permission.read" android:value="com.samsung.health.exercise;com.samsung.shealth.step_daily_trend"/> <meta-data android:name="com.samsung.android.health.permission.write" android:value="com.samsung.health.exercise"/> </application> </manifest>
The constant value of the required data type can be checked as shown below.
HEALTH_DATA_TYPE
HealthConstants.Exercise
"com.samsung.health.exercise"
Acquiring permission from the user is essential to access health data but too frequent requests of permission can annoy the user. Here are guidelines that help you to find a solution for the permission request.
Permission needs to be requested in the following cases.
And avoid requesting permission in the following cases.
See the privacy section of Programming Guide for more information.
static class
HealthPermissionManager.PermissionKey
HealthPermissionManager.PermissionResult
requestPermissions(Set, Activity)
HealthPermissionManager.PermissionType
HealthPermissionManager(HealthDataStore store)
Map<HealthPermissionManager.PermissionKey,Boolean>
isPermissionAcquired(Set<HealthPermissionManager.PermissionKey> permissionKeys)
HealthResultHolder<HealthPermissionManager.PermissionResult>
requestPermissions(Set<HealthPermissionManager.PermissionKey> permissionKeys)
requestPermissions(Set<HealthPermissionManager.PermissionKey> permissionKeys, Activity activity)
public HealthPermissionManager(HealthDataStore store)
store
public HealthResultHolder<HealthPermissionManager.PermissionResult> requestPermissions(Set<HealthPermissionManager.PermissionKey> permissionKeys)
permissionKeys
IllegalArgumentException
IllegalStateException
public HealthResultHolder<HealthPermissionManager.PermissionResult> requestPermissions(Set<HealthPermissionManager.PermissionKey> permissionKeys, Activity activity)
activity
public Map<HealthPermissionManager.PermissionKey,Boolean> isPermissionAcquired(Set<HealthPermissionManager.PermissionKey> permissionKeys)
Map.get(Object)
public class HealthPermissionManagerExample { // The state of connection private HealthDataStore mStore; private static final String APP_TAG = "MyApp"; private void CheckPermissions() { HealthPermissionManager pmsManager = new HealthPermissionManager(mStore); Set<HealthPermissionManager.PermissionKey> keys = new HashSet<HealthPermissionManager.PermissionKey>(); HealthPermissionManager.PermissionKey key1 = new HealthPermissionManager.PermissionKey( HealthConstants.BloodGlucose.HEALTH_DATA_TYPE, HealthPermissionManager.PermissionType.READ); keys.add(key1); HealthPermissionManager.PermissionKey key2 = new HealthPermissionManager.PermissionKey( HealthConstants.BloodPressure.HEALTH_DATA_TYPE, HealthPermissionManager.PermissionType.READ); keys.add(key2); try { Map resultMap = pmsManager.isPermissionAcquired(keys); if(resultMap.get(key1) == Boolean.TRUE) { Log.d(APP_TAG, "You can read the blood glucose data type."); } else { Log.d(APP_TAG, "There is no permission to read the blood glucose data type."); } if(resultMap.get(key2) == Boolean.TRUE) { Log.d(APP_TAG, "You can read the blood pressure data type."); } else { Log.d(APP_TAG, "There is no permission to read the blood pressure data type."); } } catch (Exception e) { Log.d(APP_TAG, "Check the connection."); } } }