# SpeechControlModule **Repository Path**: mirrors_xinledanding/SpeechControlModule ## Basic Information - **Project Name**: SpeechControlModule - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-26 - **Last Updated**: 2026-01-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 喜马拉雅控制api ## 1 连接controlService ```java Intent intent = new Intent("com.ximalaya.ting.android.xiaoai.controll.action"); intent.setPackage("com.ximalaya.ting.android"); // 如果targetSDK>26则必须要使用startForegroundService if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(intent); } else { startService(intent); } bindService(intent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // 获取到control类 mControlApi = IXmControlApi.Stub.asInterface(service); // 初始化(必须 ,如果校验失败后续的操作都不能执行,如果需要是新的合作可以找相关人员进行配置,给我我方包名和签名) Bundle init = mControlApi.init(); if(init == null || !init.getBoolean(XmControlConstants.DATA_TYPE_VERIFY_RESULT)) { Toast.makeText(MainActivity.this, "签名校验失败", Toast.LENGTH_SHORT).show(); return; } } @Override public void onServiceDisconnected(ComponentName name) { } } , Context.BIND_AUTO_CREATE); ``` ## 2 使用控制api ### 2.1 有两种发送控制指令方案: #### 2.1.1 executeAsync(异步方案) **参数说明:** | 字段名 | 类型 | 描述 | | -------- | -------------- | --------------------------------------------------- | | action | String | 控制指令的名称 | | params | Bundle | 控制指令需要传入的参数 | | callback | IXmApiCallback | 控制指令发出后,返回的数据 ,返回的数据通过bundle传递 | ```java executeAsync(String action, in Bundle params, IXmApiCallback callback); (异步方案) ``` #### 2.1.2 execute(同步方案) **参数说明:** | 字段名 | 类型 | 描述 | | ------ | ------ | ---------------------- | | action | String | 控制指令的名称 | | params | Bundle | 控制指令需要传入的参数 | ```java execute (String action, in Bundle params);(同步指令,结果直接通过Bundle返回) ``` > 下面的控制中如果有"Async"标识 表示要使用executeAsync进行执行 #### 2.1.3 返回的bundle 返回bundle 中的XmControlConstants.RESULT_CODE 表示表示正确或者错误的code,具体定义在ErrorCodes类中 | 名称 | 描述 | | ---------------------------------- | ---------------------------- | | ERROR_OK | 正确执行 | | ERROR_API_UNSUPPORTED_ACTION | 不支持的action(因为版本原因) | | ERROR_NEED_USER_AUTHENTICATION | 需要登录 | | ERROR_FAILED_TO_QUERY_FROM_SONG_ID | 根据songid查询失败,不能播放 | | ERROR_GET_DATA_NETWORK | 网络错误 | | ERROR_PLAY_UNKNOWN | 未知错误 | ### 2.2 播放声音列表(Async) **action:** ``` XmControlConstants.ACTION_PLAY_SONG_LIST ``` **params:** | 字段名 | 类型 | 描述 | | --------- | ------------ | ---- | | XmControlConstants.DATA_TYPE_SOUND_LIST | List |soundid的列表 英文逗号分隔 | | XmControlConstants.DATA_TYPE_PLAY_INDEX | Int |播放的位置 | ### 2.3 是否正在播放 **action:** ``` XmControlConstants.ACTION_IS_PLAYING ``` **params:** null **callback** | 字段名 | 类型 | 描述 | | --------------------------------------- | ------- | ------------ | | XmControlConstants.DATA_TYPE_IS_PLAYING | Boolean | 是否正在播放 | ### 2.4 开始播放 **action:** ``` XmControlConstants.ACTION_PLAY ``` **params:** null ### 2.5 暂停播放 **action:** ``` XmControlConstants.ACTION_PAUSE ``` **params:** null ### 2.6 是否还有下一曲 **action:** ``` XmControlConstants.ACTION_HAS_NEXT ``` **params:** null **callBack** | 字段名 | 类型 | 描述 | | ------------------------------------- | ------- | -------------- | | XmControlConstants.DATA_TYPE_HAS_NEXT | Boolean | 是否还有下一曲 | ### 2.7 是否还有上一曲 **action:** ``` XmControlConstants.ACTION_HAS_PRE ``` **params:** null **callBack** | 字段名 | 类型 | 描述 | | ------------------------------------- | ------- | -------------- | | XmControlConstants.DATA_TYPE_HAS_PRE | Boolean | 是否还有上一曲 | ### 2.8 播放下一曲 **action:** ``` XmControlConstants.ACTION_PLAY_NEXT ``` **params:** null ### 2.9 播放上一曲 **action:** ``` XmControlConstants.ACTION_PLAY_PRE ``` **params:** null ### 2.10 停止 **action:** ``` XmControlConstants.ACTION_STOP ``` **params:** null ### 2.11 获取当前播放的声音 **action:** ``` XmControlConstants.ACTION_GET_CURRENT_SONG ``` **params:** null **callback:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_GET_CURRENT_SONG | Song Parcelable | 当前声音 | ### 2.12 获取播放声音的列表(async) **action:** ``` XmControlConstants.ACTION_GET_SONG_LIST ``` **params:** null **callback:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_SONG_LIST | ParcelableArrayList 类型 | 播放声音列表 | ### 2.13 播放列表的第几个声音 **action:** ``` XmControlConstants.ACTION_TO_PLAY_INDEX ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_TO_PLAY_INDEX | int | 播放的位置 | ### 2.14 删除声音列表 **action:** ``` XmControlConstants.ACTION_REMOVE_SOUND_LIST ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_REMOVE_INDEX | int | 删除声音的位置 | ### 2.15 获取总时长 **action:** ``` XmControlConstants.ACTION_GET_TOTAL_TIME ``` **params:** null **callback:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_TOTAL_TIME | Long | 总时长(毫秒) | ### 2.16 获取当前播放时间 **action:** ``` XmControlConstants.ACTION_GET_CURRENT_TIME ``` **params:** null **callback:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_CURRENT_TIME | Long | 当前播放时间(毫秒) | ### 2.17 获取当前的播放模式 **action:** ``` XmControlConstants.ACTION_GET_PLAY_MODE ``` **params:** null **callback:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_PLAY_MODE | int |当前的播放模式
0 单曲
1 单曲循环
2 顺序播放
3 列表循环
4 随机播放 | ### 2.18 设置播放模式 **action:** ``` XmControlConstants.ACTION_SET_PLAY_MODE ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_PLAY_MODE | int | 播放模式
0 单曲
1 单曲循环
2 顺序播放
3 列表循环
4 随机播放 | ### 2.19 设置数据使用模式 **action:** ``` XmControlConstants.ACTION_SET_SET_MOBILE_PLAY_ENABLE ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_MOBILE_PLAY_ENABLE | int | 设置是否可以使用流量播放
0 不允许
1 本次允许
2 一直允许 | ### 2.20 喜欢(取消喜欢)此声音 (async 会监测是否需要登录) **action:** ``` XmControlConstants.ACTION_ADD_TO_FAVOURITE // 喜欢 XmControlConstants.ACTION_REMOVE_FAVOURITE // 取消喜欢 ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_TRACK_ID | long | 声音的id | ### 2.21 根据uri启动Activity (内部会检测,只能启动本应用的acitivtiy) **action:** ``` XmControlConstants.ACTION_START_OTHER_ACTIVITY ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_START_OTHER_ACTIVITY_URI | String | 需要启动的uri(隐式启动) | ### 2.22 播放喜欢的列表 **action:** ``` XmControlConstants.ACTION_PLAY_LIKE_SOUND ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_START_POSITION | int | 需要播放第几个 | ### 2.23 播放声音通过专辑id (async) **action:** ``` XmControlConstants.ACTION_PLAY_BY_ALBUMID ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_PLAY_ALBUMID | long |需要播放的专辑的id | |XmControlConstants.DATA_TYPE_PLAY_USE_HISTORY| boolean| 播放历史时如果有历史记录,则按照历史记录出进行播放(不设置默认是true)| ### 2.24 查询播放历史如果查到可以选择播放 (async) **action:** ``` XmControlConstants.ACTION_SEARCH_PLAY_HISTORY ``` **params:** | 字段名 | 类型 | 描述 | | --------------------------------------------- | --------------- | -------- | | XmControlConstants.DATA_TYPE_ALBUM_IDS | longArray |需要查询的专辑的id的列表 | |XmControlConstants.DATA_TYPE_HAS_SEARCH_RESULT_TO_PLAY| boolean| true表示如果有历史记录,直接播放| **callBack** | 字段名 | 类型 | 描述 | | -------------------------------------------------- | --------- | ----------------------------------------- | | XmControlConstants.DATA_TYPE_SEARCH_HISTORY_RESULT | longArray | 搜索到专辑的结果,如果没有搜索到专辑返回空 | ## 3 监听播放事件 ```java void registerPlayStatueChangeListener(IXmPlayStatusChangeCallBack callBack); void unRegisterPlayStatuChangeListener(IXmPlayStatusChangeCallBack callBack); ``` **IXmPlayStatusChangeCallBack 定义** ```java interface IXmPlayStatusChangeCallBack { // 开始播放 void onPlayStart(); // 暂停播放 void onPlayPause(); // 播放停止 void onPlayStop(); // 播放完成 void onSoundPlayComplete(); // 播放缓存完成 void onSoundPrepared(); // 切换歌曲 void onSoundSwitch(inout Song lastTrack, inout Song curTrack); // 开始缓冲 void onBufferingStart(); // 缓冲结束 void onBufferingStop(); // 缓冲进度 void onBufferProgress(int percent); // 播放进度 void onPlayProgress(int currPos, int duration); // 播放失败 void onError(); } ``` ## 4 监听其他事件 ```java // 监听其他的事件 void registerEventListener(in List events, IXmEventChangCallBack listener); // 取消监听 void unregisterEventListener(in List events, IXmEventChangCallBack listener); ``` **evnets 取值** | 字段名 | 描述 | | ------------------------------------------------- | ------------------ | | XmControlConstants.XM_API_EVENT_PLAY_LIST_CHANGED | 播放列表更改 | | XmControlConstants.XM_API_EVENT_PLAY_MODE_CHANGED | 播放模式更改 | | XmControlConstants.XM_API_EVENT_PLAY_ERROR | 播放错误(有返回值) | **IXmEventChangCallBack** ```java // paramString 表示event的名字 ,result 表示要返回的一些数据 void onEvnet(String paramString, in Bundle result); ``` **XmControlConstants.XM_API_EVENT_PLAY_ERROR 返回的result** | 字段名 | 描述 | | ---------------------------------- | ------------------------------------------------------------ | | XmControlConstants.PLAY_ERROR_TYPE | 播放错误的类型
XmControlConstants.PLAY_ERROR_TYPE_MOBILE_NET_CANNOT_PLAY 4G情况下不能播放
XmControlConstants.PLAY_ERROR_TYPE_NO_VIP 没有vip权限 | ## 5 打开页面 ``` 我们需要统计打开页面的渠道,请设置 XmCmdOpen.xmChannel = "xxx" 这个值请找我方对接人员 调用使用 XmCmdOpen.startXm(Context context ,String url); ``` ### 5.1 打开专辑页 ```java // album_id后放要跳转的专辑id iting://open?msg_type=13&album_id=xxxx ``` ### 5.2 打开声音 ```java // track_id 后放要跳转的声音id iting://open?msg_type=11&track_id=xxxx ``` ## 6 混淆 -dontwarn com.ximalaya.ting.android.host.service.xmcontrolapi.*** -keep class com.ximalaya.ting.android.host.service.xmcontrolapi.**{*;}