Skip to main content

Grant Permissions

ROOK SDK requires the user to explicitly grant permissions to access and extract data from Health Connect (Android) and Apple Health (iOS).

Request Permissions

The useRookPermissions hook provides functions to help manage permissions. The main ones are requestAllPermissions and requestSamsungHealthPermissions, which request access to health data and display a screen to guide the user through granting the necessary permissions. It also includes checkAvailability and checkSamsungAvailability, which verify whether the required services (Health Connect, Apple Health, and Samsung Health) are available and running on the device.

We recommend adding a screen for this purpose, like this:

import React, { useEffect, useState } from "react";
import { View, Text, Button, StyleSheet, Platform } from "react-native";
import { useRookPermissions } from "react-native-rook-sdk";

export const Permissions = () => {
const [isAvailable, setIsAvailable] = useState(false);
const [isSamsungAvailable, setIsSamsungAvailable] = useState(false);

const {
ready,
requestAllPermissions,
requestSamsungHealthPermissions,
checkAvailability,
checkSamsungAvailability,
} = useRookPermissions();

useEffect(() => {
if (ready) {
checkServices();
}
}, [ready]);

const checkServices = async () => {
const availability = await checkAvailability();
const samsungAvailability = await checkSamsungAvailability();

setIsAvailable(availability === "INSTALLED");
setIsSamsungAvailable(samsungAvailability === "INSTALLED");
};

const handleRequestPermissions = async () => {
try {
await requestAllPermissions();
// Optionally store a flag in local storage
} catch (error) {
console.error("Failed to request permissions:", error);
}
};

const handleSamsungPermissions = async () => {
try {
await requestSamsungHealthPermissions();
// Optionally store a flag in local storage
} catch (error) {
console.error("Failed to request Samsung permissions:", error);
}
};

return isAvailable ? (
<View style={styles.container}>
<Text style={styles.message}>
Please grant the necessary permissions
</Text>
<Button title="Request Permissions" onPress={handleRequestPermissions} />

{Platform.OS === "android" && isSamsungAvailable && (
<View style={styles.extra}>
<Text style={styles.message}>
To access background services, please grant Samsung Health permissions
</Text>
<Button
title="Request Samsung Health Permissions"
onPress={handleSamsungPermissions}
/>
</View>
)}
</View>
) : null;
};

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
paddingHorizontal: 20,
},
message: {
fontSize: 18,
marginBottom: 20,
textAlign: "center",
color: "white",
},
extra: {
marginTop: 50,
},
});

Request Android Background Permissions

We highly recommend requesting another set of permissions to sync data in the background for Android 14 or less. This step is only required for Android. To achieve this, add the following function to the previous screen:

const handleRequestBackgroundPermissions = async () => {
try {
// if you need to know if the user has requested permissions
// you need to save it on your localState
// Like async Storage to save it
await requestAndroidBackgroundPermissions();
} catch (error) {
console.log(error);
}
};

Finally your file should look like this.

import React, { useEffect, useState } from "react";
import { View, Text, Button, StyleSheet, Platform } from "react-native";
import { useRookPermissions } from "react-native-rook-sdk";

export const Permissions = () => {
const [isAvailable, setIsAvailable] = useState(false);
const [isSamsungAvailable, setIsSamsungAvailable] = useState(false);

const {
ready,
requestAllPermissions,
requestSamsungHealthPermissions,
requestAndroidBackgroundPermissions,
checkAvailability,
checkSamsungAvailability,
} = useRookPermissions();

useEffect(() => {
if (ready) {
checkServices();
}
}, [ready]);

const checkServices = async () => {
const availability = await checkAvailability();
const samsungAvailability = await checkSamsungAvailability();

setIsAvailable(availability === "INSTALLED");
setIsSamsungAvailable(samsungAvailability === "INSTALLED");
};

const handleRequestPermissions = async () => {
try {
await requestAllPermissions();
// Optionally store a flag in local storage
} catch (error) {
console.error("Failed to request permissions:", error);
}
};

const handleSamsungPermissions = async () => {
try {
await requestSamsungHealthPermissions();
// Optionally store a flag in local storage
} catch (error) {
console.error("Failed to request Samsung permissions:", error);
}
};

const handleRequestBackgroundPermissions = async () => {
try {
await requestAndroidBackgroundPermissions();
// Optionally store a flag in local storage
} catch (error) {
console.log(error);
}
};

const handleRequestBackgroundPermissions = async () => {
try {
await requestAndroidBackgroundPermissions();
// Optionally store a flag in local storage
} catch (error) {
console.log(error);
}
};

return isAvailable ? (
<View style={styles.container}>
<Text style={styles.message}>
Please grant the necessary permissions
</Text>
<Button title="Request Permissions" onPress={handleRequestPermissions} />

{Platform.OS === "android" && isSamsungAvailable && (
<View style={styles.extra}>
<Text style={styles.message}>
To access background services, please grant Samsung Health permissions
</Text>
<Button
title="Request Samsung Health Permissions"
onPress={handleSamsungPermissions}
/>
</View>
)}

{Platform.OS === "android" (
<View style={styles.extra}>
<Text style={styles.message}>
To access background services, please grant Samsung Health permissions
</Text>
<Button
title="Request Android Background Permissions"
onPress={handleRequestBackgroundPermissions}
/>
</View>
)}
</View>
) : null;
};

const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
paddingHorizontal: 20,
},
message: {
fontSize: 18,
marginBottom: 20,
textAlign: "center",
color: "white",
},
extra: {
marginTop: 50,
},
});