Use this page as the practical runtime guide after Install and Configure.

1. Define Protocol

Model what to collect using triggers, tasks, devices, and measures.

2. Deploy Protocol

Deploy through a DeploymentService (local or remote).

3. Start Runtime

Configure SmartPhoneClientManager and initialize a deployment controller.

4. Consume Data

Listen to the measurements stream and process or upload data.
CAMS can run fully local on-device (including protocol creation and deployment), which is useful for many app scenarios.

End-to-end flow

1

Define a study protocol

Configure a StudyProtocol with devices and measures to collect.
2

Deploy protocol to a deployment service

Use a DeploymentService (for example SmartphoneDeploymentService) to create a study deployment.
3

Initialize client runtime

Configure a SmartPhoneClientManager, add the study, and deploy it.
4

Resume or pause data sampling

Resume or pause data sampling in all studies or control each study.
5

Consume or save collected measurements

Listen on the measurements stream of one or more studies and use it in the app.

1) Define a study protocol

In CAMS, sensing is configured in a SmartphoneStudyProtocol. You can use the Dart API to create a protocol directly in your app like this:
This example create a study protocol that collects steps, light, and screen and battery events from the phone, stores this in the local SQLite database. Data sampling “starts” after a delay of 10 seconds.
You can use the local constructor if you’re make a “local” protocol that (i) only collects simple measures in the background, (ii) only uses the phone as a device, (ii) only have one participant, and (iv) stores data locally in the SQLite database
For deeper model details, see Domain Model and Measure Types.
For transformation formats and privacy schemas, see Data Transformation and Privacy.

2) Deploy the protocol (optional)

A study protocol is deployed via a DeploymentService.

3) Create a client runtime, and add and deploy studies

Runtime management of studies is handed by the client manager SmartPhoneClientManager.
The SmartPhoneClientManager is a singleton and can always be accessed by SmartPhoneClientManager().
The most simple configuration of the client manager is:
However, the client manager can be configured in different ways:
  • registration: unique device registration for this phone.
  • deploymentService: deployment backend (default is local SmartphoneDeploymentService).
  • dataCollectorFactory: custom collector factory (default uses the standard DeviceController).
  • enableNotifications: show task notifications (true by default).
  • enableBackgroundMode: run sampling in background (true by default, Android only).
  • backgroundNotificationTitle / backgroundNotificationText: text for Android background notification.
  • askForPermissions: request package permissions automatically (true by default).
Set askForPermissions: false when your app needs a custom permission flow or staged consent screens.
Once the client is configured, you can deploy studies to it. This is done by getting a study deployment from the deployment service, based on the protocol. In order to do this, we need to configure the client to use this deployment service. If the protocol has been added as shown above, this will add and deploy the study on the client:
This will configure the client manager and add a new study based on the specified protocol. However, if using the local SmartphoneDeploymentService, deploying and adding a study based on a protocol can be written more compact like this:
This can be written even more compact:
Note that the client manager can handle multiple studies - just add more studies to the client:

4) Control data sampling

Data sampling can be controlled by the resume and pause methods:
Calling resume() or pause() on the client manager will resume or pause all studies added to the client. If you want more fine-grained control over each study, you can control each study using its SmartphoneStudyController:
You can stop a study by calling stop which will permanently stop the study - once stopped, and study cannot be (re)started. Call dispose to dispose of the client - typically in the Flutter dispose method.
If you just want to run one local protocol, you can use this compact style:

5) Consume or listening to measurements

All sampling data is available in the measurements stream. This stream is available on both controller and client:
Since it is a standard Dart Stream, you can subscribe, filter, map, etc. as needed.