注:最近项目需求要做语音聊天这一块的功能,想了几种方案,最后还是决定用第三方服务,毕竟日活50W以下亲加是免费的!

亲加官方给了一定的技术文档,但是遇到很多坑,我顺便都介绍一下

废话不多说,先介绍Android接入,下一章介绍iOS。

1.下载开发包

亲加开发包下载地址 http://www.gotye.com.cn/download.html

即时通讯云包含丰富的聊天功能接口,不用语音通讯云了,下这个开发包

Android开发的朋友们下android的包,android的接入官方文档很详细,而且相对比较容易,我试了一下按照文档做没什么问题,这里主要介绍unity接亲加sdk,unity开发一定要用这个插件,如果想在项目eclipse的sdk环境里面接android的开发包,然后出jar,再用unity出apk包会闪退,只能用unity导出eclipse工程,然后接android才能用,显然这样搞太麻烦了,不如直接用这个插件。

2.导入开发包

正常情况,我们项目都接了各种sdk,比如各种支付的sdk(如果没有,那很好,导入了直接用),如果有的话注意不要导入AndroidMainfest,不然会覆盖原来项目的配置文件

3.注册亲加账户,并添加相关功能

添加应用:

选开放注册比较方便,以后用户登录可以不要密码

创建完后会得到应用信息,得到的appkey开发中会用到

然后添加一些IM用户和聊天室用于测试

添加用户:

添加聊天室:

4.对接口,我演示一下对语音的接口,其他的也都类似,把这个文件随便拖到场景一个组件,appkey用注册成功的key

这个示例要放在真机上跑,模拟器要报错。

using UnityEngine;
using System.Collections;
using gotye;
public class MainManager : MonoBehaviour {public GotyeAPI api;string appKey = "xxxxxxxxxxxxxxxx";string packageName = "com.gotye.api";ListenerLogin listenerLogin;ListenerChat listenerChat;ListenerRoom listenerRoom;string resurt = "";string text = "";static MainManager _instance;public static MainManager Instance {get { return _instance; }}void Awake(){InvokeRepeating("mainLoop", 0.0f, 0.050f);//初始化_instance = this;}// Use this for initializationvoid Start(){//初始化api = GotyeAPI.GetInstance();api.Init(appKey, packageName);//添加事件回调listenerLogin = new ListenerLogin();listenerChat = new ListenerChat();listenerRoom = new ListenerRoom();api.AddListener(listenerLogin);api.AddListener(listenerChat);api.AddListener(listenerRoom);}void OnGUI(){GUI.Label(new Rect(200, 0, 200, 200), text);GUI.Label(new Rect(200, 200, 200, 200), resurt);if (GUI.Button(new Rect(0, 0, 200, 100), "sq123登录")){text = "sq123登录";api.Login("sq123", null);}if (GUI.Button(new Rect(0, 100, 200, 100), "sq222登录")){text = "sq222登录";api.Login("sq222", null);}if (GUI.Button(new Rect(0, 200, 200, 100), "进入聊天室")){//298926text = "进入聊天室";GotyeRoom room = new GotyeRoom(298926);api.EnterRoom(room);}if (GUI.Button(new Rect(0, 300, 200, 100), "开始说话")){text = "开始说话";GotyeRoom room = new GotyeRoom(298926);//api.SendMessage(GotyeMessage.CreateTextMessage(room, "111"));api.StartTalk(room,0,false,20000);}if (GUI.Button(new Rect(0, 400, 200, 100), "停止说话")){text = "停止说话";api.StopTalk();}if (GUI.Button(new Rect(0, 500, 200, 100), "退出聊天室")){text = "退出聊天室";GotyeRoom room = new GotyeRoom(298926);api.LeaveRoom(room);}if (GUI.Button(new Rect(0, 600, 200, 100), "退出登录")){text = "退出登录";api.Logout();}}void mainLoop()//初始化{GotyeAPI.GetInstance().MainLoop();}//显示Gui信息public void ShowAnimate(string log) {text = log;}public void ShowResurt(string log){resurt = log;}
}

事件监听回调要继承开发包提供的接口,并且要以public的形式实现接口中所有的函数

ListenerChat:聊天回调

using UnityEngine;
using System.Collections;
using gotye;
using System.Text;
using System.Collections.Generic;
public class ListenerChat : ChatListener
{/*** 发送消息后回调* @param code 状态码 参见 {@link GotyeStatusCode}* @param message 被发送的消息对象*/public void onSendMessage(GotyeStatusCode code, GotyeMessage message){MainManager.Instance.ShowResurt("发送消息: code = " + code.ToString());}/*** 接收信息* @param code 状态码 参见 {@link GotyeStatusCode}* @param message*/public void onReceiveMessage(GotyeMessage message){if(message.Type == GotyeMessageType.Text){MainManager.Instance.ShowResurt("接收文字信息");}else if (message.Type == GotyeMessageType.Audio){MainManager.Instance.ShowResurt("接收语音信息");MainManager.Instance.api.DownloadMediaInMessage(message);}else{MainManager.Instance.ShowResurt("接收其他信息");}}/*** 下载消息* @param code 状态码 参见 {@link GotyeStatusCode}* @param message 下载的消息对象*/public void onDownloadMediaInMessage(GotyeStatusCode code, GotyeMessage message){MainManager.Instance.api.PlayMessage(message);}/*** 举报回调* @param code 状态码 参见 {@link GotyeStatusCode}* @param message 被举报的消息*/public void onReport(GotyeStatusCode code, GotyeMessage message){ }/*** 开始录制语音消息回调* @param code 状态码 参见 {@link GotyeStatusCode}* @param isRealTime 是否实时语音* @param targetType 发送对象类型* @param target  发送对象*/public void onStartTalk(GotyeStatusCode code, GotyeChatTarget target, bool isRealTime){MainManager.Instance.ShowResurt("开始录制");}/*** 停止录制语音消息回调* @param code  状态码 参见 {@link GotyeStatusCode}* @param message* @param isVoiceReal*/public void onStopTalk(GotyeStatusCode code, bool realtime, GotyeMessage message/*, bool *cancelSending*/){MainManager.Instance.ShowResurt("录制完成");GotyeRoom room = new GotyeRoom(298926);MainManager.Instance.api.SendMessage(message);}/*** 解码语音消息* @param code 状态码 参见 {@link GotyeStatusCode}* @param message 被解码的消息对象*/public void onDecodeMessage(GotyeStatusCode code, GotyeMessage message){ }/*** 获取历史消息回调* @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}* @param list 历史消息列表*/public void onGetMessageList(GotyeStatusCode code, List<GotyeMessage> list/*, bool downloadMediaIfNeed*/){ }public void onRequestCS(GotyeStatusCode code, GotyeUser user){ }/*** 设置群组消息回调* @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}* @param group 当前群组* @param msgConfig 群组的消息配置参数    */public void onSetGroupMsgConfig(GotyeStatusCode code, GotyeGroup group, GotyeGroupMsgConfig msgConfig){ }/*** 获取群组消息设置回调* @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}* @param group 当前的群组*/public void onGetGroupMsgConfig(GotyeStatusCode code, GotyeGroup group, GotyeGroupMsgConfig msgConfig){ }/*** 获取离线消息回调* @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}* @param msgList 历史消息列表* @param downloadMediaIfNeed 是否需要下载多媒体     */public void onGetOfflineMessageList(GotyeStatusCode code, List<GotyeMessage> msgList/*, bool downloadMediaIfNeed*/){ }/*** 获取历史消息回调* @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}* @param list 历史消息列表*/public void onGetHistoryMessageList(GotyeStatusCode code, List<GotyeMessage> msgList/*, bool downloadMediaIfNeed*/){ }/*** * @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}*/public void onStartAPNS(GotyeStatusCode code){ }/*** * @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}*/public void onStopAPNS(GotyeStatusCode code){ }/*** 更新未读消息回调* @deprecated* @param code 状态码 参见 {@link GotyeStatusCode}*/public void onUpdateUnreadMessageCount(GotyeStatusCode code){ }public void onGetLastMessage(GotyeChatTarget target, GotyeMessage message){ }public void onGetSessionList(List<GotyeChatTarget> list){ }public void onGetUnreadMessageCount(GotyeChatTarget target, int count){ }public void onGetTotalUnreadMessageCount(int count){ }public void onGetTotalUnreadMessageCountOfTypes(List<GotyeChatTargetType> types, int count){ }}

ListenerLogin:登录回调

using UnityEngine;
using System.Collections;
using gotye;
public class ListenerLogin : LoginListener
{public void onLogin(GotyeStatusCode code, GotyeUser user){MainManager.Instance.ShowResurt("用户登录:" + user.Name + " code = " + code.ToString());}public void onLogout(GotyeStatusCode code){MainManager.Instance.ShowResurt("用户登出:code = " + code.ToString());}public void onReconnecting(GotyeStatusCode code, GotyeUser currentUser){MainManager.Instance.ShowResurt("用户重新连接:code = " + code.ToString() + " id = " + currentUser.Name);}
}

ListenerRoom:聊天室回调

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using gotye;
public class ListenerRoom : RoomListener
{/*** 进入聊天室回调* @param code 状态码 参见 {@link GotyeStatusCode}* @param room 当前聊天室对象*/public void onEnterRoom(GotyeStatusCode code, GotyeRoom room){MainManager.Instance.ShowResurt("进入房间 code = " + code.ToString() + " roomID = " + room.ID);}/*** 离开聊天室* @param code 状态码 参见 {@link GotyeStatusCode}* @param room 当前聊天室对象*/public void onLeaveRoom(GotyeStatusCode code, GotyeRoom room){MainManager.Instance.ShowResurt("离开房间 code = " + code.ToString() + " roomID = " + room.ID);}/*** 回去聊天室列表* @param code 状态码 参见 {@link GotyeStatusCode}* @param gotyeroom 聊天室列表*/public void onGetRoomList(GotyeStatusCode code, int pageIndex, List<GotyeRoom> curPageRoomList, List<GotyeRoom> allRoomList){ }/*** 获取聊天室成员列表* @param code 状态码 参见 {@link GotyeStatusCode}* @param room 当前聊天室 * @param totalMembers 每页结果集合* @param currentPageMembers 当前页集合* @param pageIndex 当前页码*/public void onGetRoomMemberList(GotyeStatusCode code, GotyeRoom room, int pageIndex, List<GotyeUser> currentPageMembers, List<GotyeUser> totalMembers){}public void onGetLocalRoomList(List<GotyeRoom> curPageRoomList){ }public void onGetRoomDetail(GotyeStatusCode code, GotyeRoom room){}public void onGetRoomStatus(GotyeRoom room, bool In){}public void onGetRoomRealtimeStatus(GotyeRoom room, bool support){}
}

这几个文件都导入后,用unity导出eclipse工程,把导出的项目src下的三个unity文件删掉,然后把原来项目主jar包删掉

然后把项目sdk环境合并进来,在启动Activity的onCreate()中初始化亲加的api,添加这一行就可以了:

GotyeAPI.getInstance().init(getApplicationContext(), "6e6c4968-b491-4fbf-8ff1-68b06ee134ee", GotyeAPI.SCENE_UNITY3D);

运行,还有会报一些文件的错误,比如resource.ap_,都删掉,直到能在手机上跑起来,然后用俩手机对话一下,语音能互相收到,大部分内容就完成啦。

做到这一步,包已经可以出了,但是为了方便,还是用unity出包比较好,不然每次都导eclipse工程会会让人崩溃的!

5.导出jar包,用unity出apk

用这个项目导出一个主jar包,覆盖原来的,再用unity出apk

再次说一下这个大坑:

不要用亲加Android开发包添加到unity的sdk环境中出jar包,然后用unity出包。报找不到文件内容的错,这是个大坑!

在eclipse中新建项目导入开发环境测试运行没问题,总觉得是个包是OK的,但导入到unity就崩溃,哪位大侠知道这是什么原因还望告知。

unity语音聊天--亲加通讯云(Android/iOS)---android相关推荐

  1. unity语音聊天--亲加通讯云(Android/iOS)---ios

    注:最近项目需求要做语音聊天这一块的功能,想了几种方案,最后还是决定用第三方服务,毕竟日活50W以下亲加是免费的! 亲加官方给了一定的技术文档,但是遇到很多坑,我顺便都介绍一下 废话不多说,iOS这个 ...

  2. 亲加通讯云郝飞:探讨直播低延迟低流量的粉丝连麦技术

    摘要:互动是视频直播中用户体验最好的体验.目前上市场视频直播互动依靠打赏和文字互动,而对于粉丝来说,连麦上镜才是最好的用户体验.本次亲加通讯云郝飞受邀参加ArchSummit微课堂,探讨直播低延迟低流 ...

  3. android接入即时IM(接入亲加通信云)

    项目下载地址:https://github.com/townkoim/Andorid_Goty_Im_ 说明:项目为一个商业项目.有在各大市场上线.里面包含了,第三方登录,分享,推送.即时IM聊天功能 ...

  4. 漫步VR——Unity语音聊天室开发小结

    一.背景介绍 VR是什么 虚拟现实Virtual Reality的英语缩写.VR 主要有手机盒子.头盔和一体机三种. 虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环 ...

  5. 【腾讯TMQ】漫步VR——Unity语音聊天室开发小结

    作者:刘勇 一.背景介绍 VR是什么 虚拟现实Virtual Reality的英语缩写.VR 主要有手机盒子.头盔和一体机三种. 虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生 ...

  6. 官方文档 android ios,Android 和 IOS 办公文件 doc,docx,ppt pdf 文件查看

    更新记录 1.3.0(2021-04-09) 增加了 IOS 端的文件预览查看支持. 1.2.0(2020-07-01) 新增一个 android 系统文件分享的接口. 优化了打开文件时,有部分安卓机 ...

  7. sku默认点击第一个android,iOS/Android实现商品sku弹窗并选择打赏Valine

    前言 现在做的是一个商城类型的app,然后里面有商品,有spu,有sku,然后就不可避免的出现了需要在spu大背景下选择不同的规格,属性得到目标的sku,然后添加到购物车中.因为需要原生的流程远高于w ...

  8. 一次编码 android ios,android ios opus语音编码压缩库编译

    据说Opus 比speex库,aac各方面性能更好,也很适合做网络语音通话. 采样率 : 音频取样频率, 指每秒钟取得声音样本的次数.采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占 ...

  9. 【知识库专访】亲加CTO郝飞:直播技术架构解密与优化之道

    from: http://geek.csdn.net/news/detail/106068 中国已在2016年进入直播+时代,这种成本低廉.互动性高.部署便捷.稳定可靠的娱乐方式,最初仅仅局限于游戏直 ...

最新文章

  1. C++ 32位和64位
  2. OpenGL Single Point单点移动三角形的实例
  3. 神秘的“阿里星”是一群怎么样的人
  4. C++ 面向对象(数据封装)
  5. 数据结构-线性表之带头结点的双向循环链表
  6. 计算机python指什么_python之浅谈计算机基础
  7. 1.请求安全-- MD5的必要性以及实际应用场景
  8. py导入包异常跳出_马克的Python学习笔记#模块和包
  9. 【SDOI2014】数表
  10. Social Engineering Data
  11. Tar的详细用法(转自Linux伊甸园)
  12. 迅雷服务器有多少硬盘,迅雷真的比BT还伤硬盘吗?
  13. python 横坐标只显示部分数据_解决echarts中横坐标值显示不全(自动隐藏)问题
  14. 王晋康 - 替天行道 ▪ 王晋康科幻小说精选集2(2014年3月27日)
  15. js获取随机色,也可以 指定获取 深色 or 浅色。
  16. 狭义相对论的时空几何 --闽科夫斯基时空
  17. 【软件体系结构】考点总结 第三章 软件体系结构风格 XJU
  18. 一篇文章讲清楚交叉熵和KL散度
  19. 使用C语言分析分析英文字符串中的单词
  20. 【优化求解】磷虾群算法(Krill Herd Algorithm),KHA

热门文章

  1. matlab拉氏逆变换,偏微分方程的拉氏变换解法.ppt
  2. NB-IoT APN相关知识
  3. 超级计算机多层网络,超级计算机多层体系结构的摘要和描述
  4. sobel算子原理与实践
  5. python缩进块_Python“预期缩进块”
  6. HTML5期末大作业:关于家乡景点介绍主题——上海介绍(5页) HTML+CSS+JavaScript 大二实训HTML作业...
  7. 豆腐王国小游戏,烧脑推理全新来袭
  8. 都是我的错,错不该拒绝HR的心意
  9. 读书笔记三:《运营之光》互联网运营方法论与自白(上)
  10. 实体知识+字典树辅助jieba的分词(并对三国演义进行简单分析)