{"id":17978783,"url":"https://github.com/jessyancoding/raisemanagersdk","last_synced_at":"2026-01-16T00:55:14.032Z","repository":{"id":122734992,"uuid":"66422463","full_name":"JessYanCoding/RaiseManagerSDK","owner":"JessYanCoding","description":"智播项目,教育类应用场景之举手发言","archived":false,"fork":false,"pushed_at":"2017-06-09T02:41:03.000Z","size":186,"stargazers_count":12,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-29T04:14:02.191Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JessYanCoding.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2016-08-24T02:39:18.000Z","updated_at":"2021-05-15T05:11:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"948266cd-b7b2-4508-9ac7-fa5f58ffddab","html_url":"https://github.com/JessYanCoding/RaiseManagerSDK","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JessYanCoding%2FRaiseManagerSDK","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JessYanCoding%2FRaiseManagerSDK/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JessYanCoding%2FRaiseManagerSDK/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JessYanCoding%2FRaiseManagerSDK/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JessYanCoding","download_url":"https://codeload.github.com/JessYanCoding/RaiseManagerSDK/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247099850,"owners_count":20883474,"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","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":"2024-10-29T17:35:07.172Z","updated_at":"2026-01-16T00:55:14.026Z","avatar_url":"https://github.com/JessYanCoding.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# RaiseManagerSDK \n智播项目,教育类应用场景之举手发言,依赖于[直播SDK](https://github.com/Jungle68/ZBSmartLiveSDK/wiki/智播云通讯文档说明#2-直播间)\n## 举手发言需求 \n\n1. 观众端发送im消息向主播端请求举手\n\n2. 主播端同意某观众的举手后,在观众响应之前不的同意其他用户举手，并且每个请求10s后消失\n\n3. 观众端收到主播的同意请求后，开始录制语音，录制成功后上传给服务器，并用im消息发送给主播端，60s内可发送多次\n4. 主播收到im消息后,添加到语音列表,请求im消息中附带的录音url,下载录音并播放,播放完成后推送给所有观众,观众收到im消息后添加到各自的语音列表,观众点击播放才开始下载并播放\n## 举手发言SDK须知\n1. **SDK**主要由``RaiseManager``作为统一接口，因为此场景会用到录音，并且其他地方也会用到，``AudioManager``作为一个辅助并且独立(与``AudioManager``不会有任何耦合)的管理类专门负责语音的逻辑\n\n2. 举手发言的需求仅仅是一个现在的需求，此**SDK**不会只局限于此需求,提供了强大于当前需求的功能,比如,支持多人举手,多人多语音发言,主播端能定位到某个观众某条语音是否发送成功,定制开发时千万不要局限于当前需求,开发者可以在上面扩展更多需求\n3. ``RaiseManager``使用``builder``模式,可随意扩展更多参数,控制构造过程\n\n4. 此**SDK**为了扩展，让开发者有更多选择权，所以有很多地方没有高度封装，但为了快速集成当前需求，在**ext**包中提供了当前需求的一些快速实现，可以仿照实现，自定义一些其他需求的实现\n\n## 举手发言sdk用法\n### RaiseManager（主要）\n#### 参数及方法介绍: \n\u003e 构造时需要传入的参数\n\u003e \u003e 必要参数\n\u003e \u003e \u003e**Context** 上下文  \n\u003e \u003e \u003e**Cid**: 直播间的会话id   \n\u003e \u003e \u003e**Usid**: 用来表示用户的唯一码  \n\u003e \u003e \u003e**AudioManager**: 用来操作语音相关逻辑的管理类  \n \n\u003e \u003e 非必要参数\n\u003e \u003e \u003e**PresenterLisenter**: 与主播端逻辑有关联的所有回调，可在回调中实现主播在当前情况下的逻辑或`ui`处理  \n\u003e \u003e \u003e**AudienceLisenter**: 与观众端有关联的所有回调，可在回调中实现主播在当前情况下的逻辑或`ui`处理\n\u003e \u003e \u003e**AudioStatuListener**: 观众端的与语音信息有关的回调，可在回调中实现主播在当前情况下的逻辑或`ui`处理  \n\u003e \u003e \u003e**RaiseTimeout**: 举手超时时间，如果观众端在该超时时间内没有收到主播端的任何消息，即判定超时，可在回调中做相应逻辑，默认为**10s**  \n\u003e \u003e \u003e**AgreeTimeout**: 主播同意超时时间，在主播端收到举手消息后，在该超时时间内没有答复观众端同意或拒绝则判定为超时，可在回调中做相应逻辑，默认为**10s**  \n\u003e \u003e \u003e**RecordTime**: 观众端在举手成功后，录音发言的最大时间，在此时间内才可录音发言，超过此时间判定为超时，可在回调中做相应的逻辑，默认为**60s**  \n\n\u003e 公有方法\n\u003e \u003e 普通的方法  \n\u003e \u003e \u003e**raise**: 观众端向主播端举手  \n\u003e \u003e \u003e**sendAgreeMessage**: 主播端向观众端发送同意消息\n\u003e \u003e \u003e**sendRecordMessageToPresenter**: 向主播端发送录音消息  \n\u003e \u003e \u003e**sendRecordMessageToAll**: 向直播间所有观众发送录音消息  \n\u003e \u003e \u003e**handleMessage**: 统一接收所有与举手发言有关的消息，与`ImSDK`的回调结合使用  \n\u003e \u003e \u003e**release**: 释放资源\n  \n\u003e \u003e 与录音相关的方法\n\u003e \u003e \u003e**startRecord**: 开始录制语音  \n\u003e \u003e \u003e**stopRecord**: 停止录制语音,如果录制成功则上传服务器    \n\u003e \u003e \u003e**cancelRecord**: 取消录音语音\n\u003e \u003e \u003e**isRecording**: 是否正在录制语音\n\n#### 方法调用时序图:\n![举手发言回调说明](举手发言回调说明.png)\n\n#### 代码示例:\n``` java     \n     RaiseManager.Builder builder = (RaiseManager.Builder) EducationSdk.getInstance().getManger(EducationSdk.MANAGER_RAISE);\n        mRaiseManager = builder\n                .with(getActivity())\n                .cid(mCid)\n                .usid(BaseApplication.userInfo.usid)\n                .audio(mAudioManager)\n                .addAudienceLisenter(mAudienceLisenter)\n                .addAudioStatuListener(mAudioStatuListener)\n                .addPresenterLisenter(mPresenterLisenter)\n                .build();\n``` \n\n### AudioManager（辅助）\n#### Dev tips\n* `AudioManager`独立于举手发言场景，它不与举手发言场景耦合，唯一与举手场景耦合的地方时录音结束后发送消息给主播，每个场景发送的逻辑不一样，所以采用接口的方式(post interface)，让调用者实现，此场景下由`RaiseManager`实现.\n\n* 因为录音相关逻辑涉及到上传和下载的功能，`AudioManager`专注于录音处理，由于网络框架每个项目都有自己独有的一套，且庞大，所以调用者通过`HttpHelper`接口，自己实现上传下载的功能,这样保证了扩展又保证了**SDK**的大小.\n* `AudioInfo`表示录音的消息，里面封装有基本的信息，在`RaiseManager`回调中经常出现，为了扩展，`AudioManager`可以传入一个继承于`AudioInfo`的范型，这样就可以在回调中收到自己定义的录音消息对象，可以储存一些自己定义的信息.\n\n\n#### AudioInfo structure \n\nField       | Description\n:----------:|:-------------:\nfilePath    | 录音文件本地路径\nurl         | 上传到服务器的url地址\nrecordTime  | 录制的时间单位秒\nctime       | 创建的时间单位毫秒，作为此录音的唯一码\nstatus      | 0.正常状态 1.下载中 2.播放失败 3.播放中 4.播放暂停\n\n#### ★详情请查看[`AudioManager`文档](https://github.com/JessYanCoding/AudioManagerSDK)       \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjessyancoding%2Fraisemanagersdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjessyancoding%2Fraisemanagersdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjessyancoding%2Fraisemanagersdk/lists"}