- Introduction
- Demo
- Getting Started
- How to use
- Source Data
- Detailed API function description
- Change Notes
Enter Affective Cloud is a cloud algorithm platform that can perform advanced emotional data analysis based on the user’s brainwave data and heart rate data, and can also provide: relaxation, attention, pleasure, stress, excitement (internal test ), including a variety of emotional values. For details, please see Official Website.
Before starting the development, please check the Development Documents of Enter Affective Cloud to understand the structure of Affective Cloud platform and specific descriptions of the services it can provide, and determine your application The service needed. You also need to contact the administrator to register the test application, and then develop.
In order to facilitate your rapid development of the Android platform, we provide the affective cloud rapid development SDK, through which you can quickly integrate the affective cloud capabilities into your app.
Download demo apk
Description
For more demo operation instructions, please see Enter Bioelectric Acquisition Module Demo
In addition, we also provide a heart flow demonstration application, which integrates Bluetooth SDK, Bluetooth device management SDK, affective cloud SDK and other functions. For details, please see Heart Flow Demo Application
Add the following dependencies under the module's build.gradle file
implementation'cn.entertech.android:affectivecloud:2.1.0'
Add the following dependency address under the build.gradle file in the project root directory
allprojects {
repositories {
mavenCentral()
}
}
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
The SDK provides a management class EnterAffectiveCloudManager
for quick access to the affective cloud. Using this class only takes a few steps to complete the data interaction between the client and the affective cloud platform.
//biodata services
var availableBioServices = listOf(Service.EEG, Service.HR)
//affective services(Need to apply to the official)
var availableAffectiveServices = listOf(Service.ATTENTION, Service.PRESSURE, Service.AROUSAL, Service.SLEEP)
//biodata subscribe params
var biodataSubscribeParams = BiodataSubscribeParams.Builder()
.requestEEG//subscribe all eeg data
.requestHr//subscribe add heart rate data
.build()
//affective data subscribe params
var affectiveSubscribeParams = AffectiveSubscribeParams.Builder()
.requestSleep()//subscribe sleep data
.requestAttention()//subscribe attention data
.requestRelaxation()//subscribe relaxation data
.requestPressure()//subscribe pressure data
.requestPleasure()//subscribe pleasure data
.build()
//configs
var enterAffectiveCloudConfig = EnterAffectiveCloudConfig.Builder(APP_KEY, APP_SECRET, USER_ID)
.url(websocketAddress)// config websocket address
.timeout(10000)//config timeout of websocket connection unit:ms
.availableBiodataServices(availableBioServices)//available biodata services
.availableAffectiveServices(availableAffectiveServices)//available affective services
.biodataSubscribeParams(biodataSubscribeParams!!)//biodata subscribe params
.affectiveSubscribeParams(affectiveSubscribeParams!!)//affective subscribe params
.build()
//create manager
var enterAffectiveCloudManager = EnterAffectiveCloudManager(enterAffectiveCloudConfig)
//init sdk
enterAffectiveCloudManager?.init(object : Callback {
override fun onError(error: Error?) {
messageReceiveFragment.appendMessageToScreen("init failed:${error.toString()}")
}
override fun onSuccess() {
messageReceiveFragment.appendMessageToScreen("init success")
}
})
Parameter Description
Parameter | Type | Description |
---|---|---|
websocketAddress | String | Affective cloud server link, see link |
Parameter | Type | Description |
---|---|---|
APP_KEY | String | Generated by our background: App Key |
APP_SECRET | String | Generated by our background: App Secret |
USER_ID | String | The id of the current user of your app, such as mobile phone number, id number, nickname, etc., must be unique. See userID for details |
Note that if you want to return data in real time, you need to configure and subscribe to the corresponding data field in the above steps, otherwise the monitor will return no data.
enterAffectiveCloudManager!!.addBiodataRealtimeListener {
messageReceiveFragment.appendMessageToScreen("Basic service real-time data: ${it.toString()}")
}
enterAffectiveCloudManager!!.addAffectiveDataRealtimeListener {
messageReceiveFragment.appendMessageToScreen("Affective service real-time data: ${it.toString()}")
}
Upload brainwave data
enterAffectiveCloudManager?.appendEEGData(bytes)
Upload heart rate data
enterAffectiveCloudManager?.appendHeartRateData(heartRate)
Note: The above data are all directly returned by the hardware. If the hardware has data to return, call the corresponding method and input the data without other processing.
The report field returned is determined by the previous configuration. For detailed descriptions of specific fields, see Biodata Basic Report Parameters and Affective Calculation Report Parameters.
enterAffectiveCloudManager?.getBiodataReport(object: Callback2<HashMap<Any, Any?>> {
override fun onSuccess(t: HashMap<Any, Any?>?) {
messageReceiveFragment.appendMessageToScreen("Basic report: ${t.toString()}")
}
override fun onError(error: Error?) {
messageReceiveFragment.appendMessageToScreen("Basic report error: ${error.toString()}")
}
})
enterAffectiveCloudManager?.getAffectiveDataReport(object: Callback2<HashMap<Any, Any?>> {
override fun onSuccess(t: HashMap<Any, Any?>?) {
messageReceiveFragment.appendMessageToScreen("Affective report: ${t.toString()}")
}
override fun onError(error: Error?) {
messageReceiveFragment.appendMessageToScreen("Affective report error: ${error.toString()}")
}
})
Note that you need to call the following release
method to release resources every time you use the affective cloud service, otherwise you will face the risk of continuous deductions
enterAffectiveCloudManager?.release(object: Callback {
override fun onSuccess() {
messageReceiveFragment.appendMessageToScreen("Affective cloud has been successfully disconnected!")
}
override fun onError(error: Error?) {
messageReceiveFragment.appendMessageToScreen("Affective cloud disconnection failed: ${error}")
}
})
The "allow" parameter can be predefined when the affective cloud is initialized to specify whether the server saves the source data of the current session.
var storageSettings = StorageSettings.Builder()
.allowStoreRawData(true)// whether to allow the raw data to be saved on the server
.build()
var enterAffectiveCloudConfig =
EnterAffectiveCloudConfig.Builder(appKey!!, appSecret!!, USER_ID)
.storageSettings(storageSettings) //storage settings
.otherParams(otherParams) //other params,reference the docs above
.build()
You can query and delete the source data through AffectiveCloudSourceDataApi
var affectiveSourceDataApi = AffectiveCloudSourceDataApiFactory.createApi(serverUrl,APP_KEY,APP_SECRET,USER_ID)
Authorization is required before operating on raw data
affectiveSourceDataApi.auth(fun(token){
Log.d("AffectiveCloudSourceDataApi","auth success ${token}")
},fun(error){
Log.d("AffectiveCloudSourceDataApi","auth failed ${error}")
})
Query all data of the current account
affectiveSourceDataApi.getSourceDataPageList(1,10,fun(lists){
Log.d("AffectiveCloudSourceDataApi","get records list success:${lists}")
},fun(error){
Log.d("AffectiveCloudSourceDataApi","get records list failed:${error}")
})
Query by user ID
affectiveSourceDataApi.getSourceDataByUserId(userId, fun(lists) {
Log.d("AffectiveCloudSourceDataApi","get records list success:${lists}")
}, fun(error) {
Log.d("AffectiveCloudSourceDataApi","get records list failed:${error}")
})
Query by Record ID
affectiveSourceDataApi.getSourceDataById(recordId, fun(lists) {
Log.d("AffectiveCloudSourceDataApi","get records list success:${lists}")
}, fun(error) {
Log.d("AffectiveCloudSourceDataApi","get records list failed:${error}")
})
Delete based on Record ID
affectiveSourceDataApi.deleteSourceDataRecordById(recordId, fun() {
Log.d("AffectiveCloudSourceDataApi","delete record success")
}, fun(error) {
Log.d("AffectiveCloudSourceDataApi","delete record failed")
})
Params | Type | Description |
---|---|---|
record_id | Int | record id |
client_id | String | client id (MD5 encryption format of user id) |
session_id | String | session id |
device | String | device |
data_type | String | type: eeg 、hr |
start_time | String | session start time |
close_time | String | session close time |
rec | String | tag |
sex | String | gender m:male;f:female |
age | Int | age |
url | String | raw data file url |
gmt_create | String | Record create time |
gmt_modify | String | Record update time |
app | Int | platform |
mode | List | mode |
case | List | case |
If you need to use affective cloud services flexibly according to different scenarios, you can use EnterAffectiveCloudApi
to call the corresponding API, which encapsulates all the external interfaces of affective cloud services. For more detailed Affective Cloud API, please refer to Affective Cloud Detailed API Function Description