Skip to content
This repo contains a number of OSGi plugins that can be used together with an AmbientDynamix application on Android to run experiments on mobile phones.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
Open Context Plugin Sdk

Smartphone Experimentation Sensor Plugins

In order to access sensors of the Android smartphone experimenters need to implement or use Context Plugins that are executed in the experimenter's smartphones and collect data periodically.

Each plugin generates a list of measurements that are passed to the Experiment Plugins in order to be processed and generate the actual experiment results that are posted on the server.

Plugins are built using the Ambient Dynamix framework and the Open Context Plugin Sdk.

Creating a new Plugin

The simplest way is to copy the plugin template available and simply change the name, context type and the 'Runtime' class of the plugin. For example in the 'NoiseLevelPlugin' you need to modify the 'AndroidManifest.xml', 'MANIFEST.MF' and source files under the 'org.ambientdynamix.contextplugins.NoiseLevelPlugin' package.

The 'PluginFactory' class is used to instantiate the plugin during runtime and actually launches the specified '*PluginRuntime' class provided by calling its 'init' method.

The 'start', 'stop' methods are used internally by the osgi manager to enable or disable the plugin. You need to to stop monitoring sensors and seize all activities of the plugin when the stop method is called in order to limit the ammount of battery consumed by your plugin.

The 'handleContextRequest' and 'handleConfiguredContextRequest' methods are used by the osgi framework when an updated sensor value is needed. Typically this is done every 30 - 60 seconds, but times may vary based on the experiment.

Accessing Android Sensors

For security reasons access to the Sensor and SensorManager classes is restricted. Instead you need to access the SecuredSensorManager that proxies the requests performed and limits acces to incoming requests. For example to access the Ambient Temperature Sensor of the phone you need to execute the following:

  mSensorManager = (SecuredSensorManager) this.context.getSystemService(Context.SENSOR_SERVICE);
  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);

Generating Sensor Measurements

To generate measurements Sensor Plugins use the internal 'Reading' class. The class contains a 'context' that device the source of the measuremnt, a 'timestamp' that refers to the time instant of the measurement and a 'value' which is the string representation of a map of all the received sensor readings. A measurement can contain multiple sensor measurements like temperature, humidity and atmospheric pressure. All measurements are passed to a PluginInfo that is parsed from the osgi manager.

  //the container of the measurements
  PluginInfo info = new PluginInfo();
  //the json object that contains sensor readings
  JSONObject obj = new JSONObject();
  //adding all sensor readings to the json object
  obj.put("org.ambientdynamix.contextplugins.AmbientTemperature", temperature);
  //creating a Reading and pass it to the PluginInfo object
  r.add(new Reading(obj.toString(), PluginInfo.CONTEXT_TYPE));
  //send the event to the osgi manager
  //the last value is the time the measurement is valid for
  sendContextEvent(requestId, new SecuredContextInfo(info, PrivacyRiskLevel.LOW), 60000);
You can’t perform that action at this time.