Menu

Next step

To continue implementing please see the instructions depending on how you are building your app:

    - Native
    - Cordova
    - React Native

Add the following dependencies to your app/build.gradle:

Show code example
Hide code example
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.aar']) 
    implementation 'androidx.core:core-ktx:1.13.1'
    implementation 'androidx.health.connect:connect-client:1.1.0-alpha08'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.5'
    implementation 'androidx.security:security-crypto:1.0.0'
    implementation 'androidx.work:work-runtime-ktx:2.9.1'
    implementation 'com.auth0.android:jwtdecode:2.0.2'
    implementation 'com.google.code.gson:gson:2.11.0'
    implementation 'com.squareup.okhttp3:okhttp:4.7.2'
    implementation 'androidx.activity:activity-compose:1.9.2'
}

Usage

Add the following to your MainActivity.kt:

Breaking change: you MUST have requested and granted the android.Manifest.permission.ACTIVITY_RECOGNITION permission in order to connect the WeFitter SDK. If not granted, the connection to WeFitter SDK will fail.

Furthermore, you can configure the list of App permissions your App has been approved for, so that the user only gets to see those permissions to grante access to his health data.

Show code example
Hide code example
import com.wefitter.healthconnect.WeFitterHealthConnect
import com.wefitter.healthconnect.WeFitterHealthConnectError

class MainActivity : AppCompatActivity() {

    private val prefix = "android.permission.health"
    private val app_permissions = setOf(
        "$prefix.READ_DISTANCE",
        "$prefix.READ_STEPS",
        "$prefix.READ_TOTAL_CALORIES_BURNED",
        "$prefix.READ_HEART_RATE",
        "$prefix.READ_POWER",
        "$prefix.READ_EXERCISE",
        //"$prefix.READ_BLOOD_GLUCOSE",
        //"$prefix.READ_BLOOD_PRESSURE",
        //"$prefix.READ_BODY_FAT",
        //"$prefix.READ_BODY_TEMPERATURE",
        "$prefix.READ_HEIGHT",
        //"$prefix.READ_OXYGEN_SATURATION",
        "$prefix.READ_WEIGHT",
        "$prefix.READ_SPEED",  
        "$prefix.READ_SLEEP",
     )

    private val healthConnectPermissionRequest = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        Log.i(TAG, "permissions $permissions")
        when {
            permissions.getOrDefault(android.Manifest.permission.ACTIVITY_RECOGNITION, false) -> {
            }
            permissions.getOrDefault(android.Manifest.permission.POST_NOTIFICATIONS, false) -> {
            }
            else -> {
                // No health connect access granted, service can't be started as it will crash
                Toast.makeText(this, "Health permission is required!", Toast.LENGTH_SHORT).show()
            }
        }
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // initialize WeFitter for Health Connect
        val client = WeFitterHealthConnect(this)

        healthConnectPermissionRequest.launch(
            arrayOf(
                android.Manifest.permission.ACTIVITY_RECOGNITION,
                android.Manifest.permission.POST_NOTIFICATIONS))

        // enter the token from the `bearer` field you receive in the response when a WeFitter profile was created via the [WeFitter API](https://www.wefitter.com/en-us/developers/documentation/#operation/profile_create)
        val token = "BEARER_TOKEN"

        // initil
        setContent {
            var checkedState by remember { mutableStateOf(false) }
            var errorMessage by remember { mutableStateOf("") }

            // create statusListener to receive status changes and errors
            val statusListener = object : WeFitterHealthConnect.StatusListener {
                override fun onConfigured(configured: Boolean) {
                    Log.i(WeFitterHealthConnect.TAG, "configured: $configured")
                }

                override fun onConnected(connected: Boolean) {
                    Log.i(WeFitterHealthConnect.TAG, "connected: $connected")
                    checkedState = connected
                }

                override fun onError(error: WeFitterHealthConnectError) {
                    Log.e(WeFitterHealthConnect.TAG, "error: ${error.message}")
                    errorMessage = error.message
                }

            }

            // `configure` should be called every time your app opens
            client.configure(
                token = token,
                statusListener = statusListener,
                appPermissions = app_permissions
            )

            WeFitterForHealthConnectTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background,
                ) {
                    Column(
                        verticalArrangement = Arrangement.Center,
                        horizontalAlignment = Alignment.CenterHorizontally
                    ) {
                        Switch(checked = checkedState, onCheckedChange = {
                            if (it) {
                                client.connect()
                            } else {
                                client.disconnect()
                            }
                        })
                        Text(
                            text = errorMessage, color = Color.Red
                        )
                    }
                }
            }
        }
    }

}

Je bent ingeschreven!

Binnenkort ontvang je onze nieuwsbrief!
WeFitter team.