{"id":34636800,"url":"https://github.com/entertech/enter-affective-offline-sdk","last_synced_at":"2026-05-27T11:33:22.478Z","repository":{"id":206905695,"uuid":"717936374","full_name":"Entertech/Enter-Affective-Offline-SDK","owner":"Entertech","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-09T02:19:37.000Z","size":96802,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-09T03:24:46.747Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Entertech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-11-13T02:14:26.000Z","updated_at":"2025-06-09T02:16:27.000Z","dependencies_parsed_at":"2025-06-09T03:32:13.359Z","dependency_job_id":null,"html_url":"https://github.com/Entertech/Enter-Affective-Offline-SDK","commit_stats":null,"previous_names":["entertech/enter-affective-offline-sdk"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Entertech/Enter-Affective-Offline-SDK","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Entertech%2FEnter-Affective-Offline-SDK","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Entertech%2FEnter-Affective-Offline-SDK/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Entertech%2FEnter-Affective-Offline-SDK/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Entertech%2FEnter-Affective-Offline-SDK/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Entertech","download_url":"https://codeload.github.com/Entertech/Enter-Affective-Offline-SDK/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Entertech%2FEnter-Affective-Offline-SDK/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28005408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-12-24T17:02:42.304Z","updated_at":"2025-12-24T17:04:26.897Z","avatar_url":"https://github.com/Entertech.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 回车情感离线算法SDK说明文档\n\n## 情感离线算法SDK\n\n### 说明\n\n将硬件端采集到的脑电和心率原始数据传入情感离线算法SDK，可以计算出实时分析值和最终报表值。\n\n在开始开发前，你需要联系管理员注册好测试应用。确定好你的应用中所**需要的服务**\n，然后在[管理后台](https://admin.affectivecloud.cn/#/offline_applications/offline_app_manager)\n\\[下载授权文件]，然后再进行开发。\n\n### 注意事项\n\n#### 代码混淆\n\n    -keep class cn.entertech.affectivesdk.authentication.bean.** { *; }\n\n#### so 文件说明\n\n算法核心功能实现依赖 so 库。在使用 SDK ，以及向工程中添加 so 时请注意以下几点：\n\n##### 确保添加了正确的 so 库文件\n\n###### **何为正确的 so 文件？**\n\n官方发布新版 SDK 时一定会同时更新 jar 文件和 so 文件，您需要做的是更新这些文件到您的工程中，不要出现遗漏。您可以参考Eclipse、Android\nStudio 配置工程提到的添加方法进行操作。\n\n##### 确保添加的 so 库文件与平台匹配\n\n###### **何为正确的 so 文件与平台匹配？**\n\narm与x86，这代表核心处理器（cpu）的两种架构，对不同的架构需要引用不同的 so 文件，如果引用出现错误是不能正常使用\nSDK 的。\n\n解决这个问题最简单的办法是在 libs 或 jnilibs 文件夹下只保留 arm64-v8a 一个文件夹。\n\n### 集成\n\n#### 本地依赖\n\n将Demo中app/libs目录下的1.3.4-svm-authentication.aar文件\n\n\n\n### 使用\n\n#### 获取离线计算服务\n\n```kotlin\nIAffectiveDataAnalysisService.getService(AffectiveServiceWay.AffectiveLocalService)\n或者\nEnterAffectiveLocalService():IAffectiveDataAnalysisService\n\n```\n\n#### 连接离线计算服务\n\n     IAffectiveDataAnalysisService.connectAffectiveServiceConnection(\n    \t\t\tIConnectionServiceListener,\n    \t\t\t//以默认值就行\n                EnterAffectiveConfigProxy\n            )\n\n    interface IConnectionServiceListener {\n        /**\n         * 连接成功 \n         * @param sessionId sessionId\n         * */\n        fun connectionSuccess(sessionId:String?)\n\n        /**\n         * 连接失败\n         * */\n        fun connectionError(error: Error?)\n    }\n\n#### **授权文件获取与使用**\n\n##### **获取**\n\n用户点击[管理后台](https://admin.affectivecloud.cn/#/offline_applications/offline_app_manager)\n\\[下载授权文件]按钮，服务端创建一个授权文件。其中包含用户的授权信息，例如用户ID、授权日期、授权期限、授权算法等，并对这个文件进行私钥签名。\n\n##### **使用**\n\n###### 若授权文件放在工程res/raw文件夹\n\n    private val authenticationInputStream: InputStream? by lazy {\n            resources.openRawResource(R.raw.check)\n        }\n\n###### 若授权文件放在工程res/assets文件夹\n\n     private val authenticationInputStream: InputStream? by lazy {\n            resources.assets.open(fileName)\n        }\n\n###### 若授权文件放在工程其他目录下\n\n     private val authenticationInputStream: InputStream? by lazy {\n            FileInputStream(File)\n        } \n\n#### 启动离线计算服务\n\n    IAffectiveDataAnalysisService.startAffectiveService(\n                        authenticationInputStream,\n                        Context, IStartAffectiveServiceLister\n\n)\n\n\n```\ninterface IStartAffectiveServiceLister {\n    /**\n     * 启动成功\n     * */\n    fun startSuccess(){\n\n    }\n\n    /**\n     * 启动生物基础服务失败\n     * */\n    fun startBioFail(error: Error?){\n\n    }\n\n    /**\n     * 启动生理基础服务失败\n     * */\n    fun startAffectionFail(error: Error?){\n\n    }\n\n    /**\n     * 启动失败\n     * */\n    fun startFail(error: Error?){\n\n    }\n\n    /**\n     * 已经启动\n     * */\n    fun hasStarted(){\n\n    }\n}\n```\n\n\n#### 订阅数据回调\n\n实时数据字段说明详见：[基础数据字段说明](https://github.com/Entertech/Enter-Affective-Offline-SDK/blob/main/%E5%AE%9E%E6%97%B6%E7%94%9F%E7%89%A9%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E5%AD%97%E6%AE%B5%E8%AF%B4%E6%98%8E.md),[情感数据字段说明](https://github.com/Entertech/Enter-Affective-Offline-SDK/blob/main/%E5%AE%9E%E6%97%B6%E7%94%9F%E7%90%86%E7%8A%B6%E6%80%81%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E5%AD%97%E6%AE%B5%E8%AF%B4%E6%98%8E.md)\n\n    IAffectiveDataAnalysisService.subscribeData(\n    \t\t//生物基础数据\n            bdListener: ((RealtimeBioData?) -\u003e Unit)? = null,\n    \t\t//生理数据\n            listener: ((RealtimeAffectiveData?) -\u003e Unit)? = null\n        )\n\n#### 取消订阅数据回调\n\n     /**\n         * 取消订阅\n         * */\n        IAffectiveDataAnalysisService.unSubscribeData(\n            bdListener: ((RealtimeBioData?) -\u003e Unit)? = null,\n            listener: ((RealtimeAffectiveData?) -\u003e Unit)? = null\n        )\n\n#### 重启离线计算服务\n\n      /**\n         * 重启离线计算服务\n         * */\n        IAffectiveDataAnalysisService.restoreAffectiveService(listener: IStartAffectiveServiceLister)\n\n#### 结束离线计算服务\n\n       IAffectiveDataAnalysisService.finishAffectiveService(listener: IFinishAffectiveServiceListener)\n       \n       IAffectiveDataAnalysisService.suspendFinishAffectiveService()\n\n#### 分析本地文件数据\n\n       /**\n         * @param inputStream 待分析的数据流\n         * @param callback 结果回调\n         * @param appSingleData 处理单个数据，若返回true，则表示消耗该数据，不添加到all数据里面\n         * @param case 数据流读取出来的字符串转成需要的类型R\n         * @param appendAllData 处理所有未被消耗的数据\n         * */\n        fun \u003cR\u003e readFileAnalysisData(inputStream: InputStream,\n                                     appSingleData: ((R) -\u003e Boolean)? = null,\n                                     appendAllData: (List\u003cR\u003e) -\u003e Unit,\n                                     case: (String) -\u003e R,\n                                     callback: Callback,\n        )\n\n#### 处理数据\n\n```\n\t/**\n     * 发送EEG数据 isEar是否为耳道数据\n     * */\n\n    fun appendEEGData(brainData: ByteArray, isEar: Boolean = false)\n    fun appendEEGData(brainData: Int, isEar: Boolean = false)\n    fun appendEEGData(brainData: List\u003cInt\u003e, isEar: Boolean = false)\n    \n\n\n    /**\n     * 单通道数据 isEar是否为耳道数据\n     * */\n    fun appendSCEEGData(brainData: ByteArray, isEar: Boolean = false)\n    fun appendSCEEGData(brainData: Int, isEar: Boolean = false)\n    fun appendSCEEGData(brainData: List\u003cInt\u003e, isEar: Boolean = false)\n\n    /**\n     * 添加心率数据\n     * */\n    fun appendHeartRateData(heartRateData: Int)\n\n\n    /**\n     * PEPR数据\n     * */\n    fun appendPEPRData(peprData: ByteArray)\n\n\n```\n\n\n#### 添加服务连接状态监听\n\n    fun addServiceConnectStatueListener(\n        connectionListener: () -\u003e Unit,\n        disconnectListener: (String) -\u003e Unit\n    )\n\n#### 移除服务连接状态监听\n\n    fun removeServiceConnectStatueListener(\n        connectionListener: () -\u003e Unit,\n        disconnectListener: (String) -\u003e Unit\n    )\n\n#### 当前离线计算服务是否启动\n\n    fun hasConnectAffectiveService(): Boolean\n\n#### 当前离线计算服务是否连接\n\n    fun hasConnectAffectiveService(): Boolean\n\n#### 关闭离线计算服务连接\n\n```kotlin\n/**\n * 断开\n * */\nfun closeAffectiveServiceConnection()\n```\n\n#### 获取报表\n\n相应返回的 report\n字段，具体字段的详细描述见[报表数据字段详情](https://github.com/Entertech/Enter-Affective-Offline-SDK/blob/main/%E6%8A%A5%E8%A1%A8%E6%95%B0%E6%8D%AE%E5%AD%97%E6%AE%B5%E8%AF%B4%E6%98%8E.md)。\n\n    /**\n     * 获取报表\n     * @param needFinishService 是否需要自动结束离线计算服务 true 自动结束\n     * */\n    fun getReport(listener: IGetReportListener, needFinishService: Boolean)\n\n    /**\n     * 获取报表接口\n     * */\n    interface IGetReportListener {\n\n        /**\n         * 获取报表出错\n         * */\n        fun onError(error: Error?)\n\n\n        /**\n         * 获取报表成功\n         * */\n        fun onSuccess(report: UploadReportEntity?)\n\n        /**\n         * 获取生物基础数据报表出错\n         * */\n        fun getBioReportError(error: Error?)\n\n\n        /**\n         * 获取生理状态分析数据报表出错\n         * */\n        fun getAffectiveReportError(error: Error?)\n    }\n\n支持挂起函数\n\n```\n   suspend fun suspendGetReport(needFinishService: Boolean): UploadReportEntity?\n```\n\n\n\n##### 脑波数据百分化\n\n    BioDataUtils.brainwave2Rate(\n            alpha: Double,\n            beta: Double,\n            gamma: Double,\n            delta: Double,\n            theta: Double,\n            brainwaveRate: (\n                Double,\n                Double,\n                Double,\n                Double,\n                Double\n            ) -\u003e Unit\n        )\n\n|      参数       |                                                          类型                                                           |                 说明                  |\n|:-------------:|:---------------------------------------------------------------------------------------------------------------------:|:-----------------------------------:|\n|     alpha     |                                                        Double                                                         |                                     |\n|     beta      |                                                        Double                                                         |                                     |\n|     gamma     |                                                        Double                                                         |                                     |\n|     delta     |                                                        Double                                                         |                                     |\n|     theta     |                                                        Double                                                         |                                     |\n| brainwaveRate | (            Double,             Double,             Double,             Double,             Double         ) -\u003e Unit | 返回alpha，beta，gamma，delta，theta占比，小数 |\n\n#### 流程图\n\n```mermaid\ngraph LR\n\n设置连接情感云服务监听--\u003e\n连接情感云服务--\u003e\n启动情感云服务--\u003e处理数据\n处理数据--\u003e获取报表\n处理数据--\u003e订阅数据解析\n订阅数据解析--\u003e取消订阅\n取消订阅--\u003e结束情感云服务\n取消订阅--\u003e获取报表\n获取报表--\u003e结束情感云服务--\u003e\n关闭情感服务连接\n\n```\n\n#### 辅助功能\n\n##### **调式日志**\n\n如果调试阶段需要打印日志调用如下方法：\n\n```kotlin\nAffectiveLogHelper.printer = object : ILogPrinter {\n    override fun d(tag: String, msg: String) {\n    }\n\n    override fun i(tag: String, msg: String) {\n    }\n\n    override fun e(tag: String, msg: String) {\n    }\n}\n```\n\n内部默认使用DefaultLogPrinter\n\n    object DefaultLogPrinter:ILogPrinter {\n        override fun d(tag: String, msg: String) {\n            Log.d(tag, msg)\n        }\n\n        override fun i(tag: String, msg: String) {\n            Log.i(tag, msg)\n        }\n\n        override fun e(tag: String, msg: String) {\n            Log.e(tag, msg)\n        }\n    }\n\n##### 支持**串口单通道数据处理**（Sceeg）\n\n###### 原始数据包结构\n\n| 包头             | 包长度  | 脱落检测数据             | 第一个数据    | 第二个数据    | 第三个数据    | 第四个数据    | 第五个数据    | 校验位（单字节对比校验） | 包尾             |\n|:---------------|:-----|:-------------------|:---------|:---------|:---------|:---------|:---------|:-------------|:---------------|\n| 3字节            | 1字节  | 1字节                | 3个字节     | 3个字节     | 3个字节     | 3字节      | 3个字节     | 1字节          | 3字节            |\n| 0xBB-0xBB-0xBB | 0x18 | 0x00(0为佩戴正常，非0为脱落) | 00-01-02 | 03-04-05 | 06-07-08 | 09-0A-0B | 0C-0D-0E | 0x77         | 0xEE-0xEE-0xEE |\n\n###### 解析完整的单通道数据\n\n    SingleChannelEEGUtil.process(byteInt: Int, appendDataList: (List\u003cInt\u003e) -\u003e Unit)\n\n|       参数       |          类型          |                        说明                         |\n|:--------------:|:--------------------:|:-------------------------------------------------:|\n|    byteInt     |         Int          | Byte 转成0-255的int型，可通过CharUtil.converUnchart方法进行转换 |\n| appendDataList | (List\\\u003cInt\u003e) -\u003e Unit |                  处理一个有效的单通道数据的方法                  |\n\n###### 解析并放入算法处理单通道(Sceeg)数据\n\n     SingleChannelEEGUtil.process(byteInt,{sceegData-\u003e\n                affectiveService?.appendSCEEGData(sceegData)\n    })\n\n### 常见问题\n\n#### 运行demo 报 dlopen failed: library \"libaffective.so\" not found\n\n使用adb命令查询目标设备或模拟器的架构\n\n    adb shell getprop ro.product.cpu.abi\n\n在项目application类型的组件下的gradle 中的android/defaultConfig添加下面配置代码。abi指的是目标设备或模拟器的架构。\n\n    ndk {\n                abiFilters abi\n        }\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fentertech%2Fenter-affective-offline-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fentertech%2Fenter-affective-offline-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fentertech%2Fenter-affective-offline-sdk/lists"}