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

注:最近项目需求要做语音聊天这一块的功能,想了几种方案,最后还是决定用第三方服务,毕竟日活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 initialization
    void 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), "进入聊天室"))
        {
            //298926
            text = "进入聊天室";
            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就崩溃,哪位大侠知道这是什么原因还望告知。

时间: 2024-11-19 15:12:08

unity语音聊天--亲加通讯云(Android/iOS)---android的相关文章

unity语音聊天之 www.GetAudioClip

最近在开发语音聊天功能,游戏需要跨平台安卓与ios,上传本地录制的wav文件至服务器后,需要根据服务器返回的地址进行语音文件的下载并进行播放. 这里通过使用www进行下载并播放 其中在ios播放时却不行了,查询官方文档后发现,ios必须使用mp3,同时ios并不支持流,public AudioClip GetAudioClip(bool threeD, bool stream, AudioType audioType);修改第二个和第三个值即可(不过服务端是将wav转换成mp3的) http:/

客户端(android,ios)与服务器通信

android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏览器,经过浏览器的渲染,即为我们所看到的效果 客户端(android,ios)android通过 httpClient或urlconnection等网络请求去实现http请求,(相当于浏览器,发送 url请求),即访问服务器,服务器响应请求,并把结果返回给客户端,经过客户端渲染,即为我们看到的效果.

Unity3D 实现简单的语音聊天 [Android版本]

上次简单说了iOS版本的聊天功能 Unity3D 实现简单的语音聊天 [iOS版本] 这次我们接着上篇来说下Android版本来实现简单的语音聊天,流程和iOS基一样的 @[email protected] 在这里我们可能会遇到一下问题: 1.U3D C# 与 Android Java之间是怎么通讯 2.Android怎么调用原生的录音功能和播放功能 好,我们逐一解决问题 1.U3D C# 与 Android Java之间是怎么通讯 相比iOS,Android这边会比较简单些 再C# 中这样调用

Android 即时语音聊天工具 开发

使用融云SDK 1. 功能需求分析 1.1 核心功能需求: * 即时通讯 * 文字聊天 * 语音聊天 1.2 辅助功能需求: * 注册.登录 * 好友添加功能 * 好友关系管理 2. 融云即时通讯平台简介 2.1 平台简介, * 即时通讯,实时网络 提供商 * 客户端IM组件, 客户端IM基础库, WebSDK,服务端 REST API 2.2 平台架构介绍 我们需要关系 App, App Server 2.3 概念介绍 * App Key/Secret:  有生产环境 和 开发环境区别 * T

Android仿微信语音聊天界面

有段时间没有看视频了,昨天晚上抽了点空时间,又看了下鸿洋大神的视频教程,又抽时间写了个学习记录.代码和老师讲的基本一样,网上也有很多相同的博客.我只是在AndroidStudio环境下写的. --主界面代码-- public class MainActivity extends Activity { private ListView mListView; private ArrayAdapter<Recorder> mAdapter; private List<Recorder>

Android仿微信语音聊天

完整代码下载地址: Android仿微信语音聊天 效果图: 分析: 1.自定义Button中要复写onTouchEvent的DOWN,MOVE,UP三种状态,对正常按下,想要取消发送,抬起三种动作进行侦听处理. 2.Dialog共有三种状态,除上图所示的两种外,还有一个录音时间过短的提示.其中录音状态中的音量可以变化. 3.显示录音的ListView的item中有一个录音时长(TextView),一个播放动画(View)和一个头像(ImageView). 4.录音类里有两个成员:录音长度,录音路

【iOS开发】封装聊天输入框MKInputBar,语音支持iOS &amp; Android平台

最近做的一个项目,有聊天的功能,最开始从网上找了个被人封装好的输入框,写的很复杂(反正我有点被看迷糊了),用起来呢又有点问题,最终放弃,自己封装了一个聊天输入框MKInputBar,难度不大.语音支持iOS和Android平台,其实就是把caf转换为mp3.底部给出了Demo工程,用起来很简单. 先上几张图吧       用法很简答,封装好只有两个文件MKInputBar.h & MKInputBar.m,实现三个代理方法: 1 - (void)inputBar:(MKInputBar *)in

各种即时通讯云产品之我见

    这是一个无处不社交化的时代,且不说年轻人无时不刻掏出智能手机来浏览微信朋友圈.刷刷微博,就连我身边的很多上了岁数的老人也以会分享照片会通过各种App进行聊天联系为基本技能来学习之.因此各种时髦和常用的App都有了即时通讯的功能,以此来维护并扩展其自身的用户"圈子",进而保持用户黏性的效果. 经历了这两年的蓬勃发展,即时通讯云产品领域早已不是"北平无战事",各路诸侯烽烟四起,都聚雄霸天下之势.它们除了具备能单聊.群聊.声音图片分享以及能快速添加并集成到现有Ap

Android IOS WebRTC 音视频开发总结(六三)-- 2016国内IM云服务行业分析

本文主要国内IM云服务行业分析,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 谈到IM我们最先想到的是qq和微信,不过我们今天要谈的不是面向终端用户的IM产品,而是面向开发者和企业的IM云服务,也就是IM PaaS. 随着移动互联网快速发展,App对IM的需求越来越强烈,但这种功能涉及较高的技术门槛.较长的开发周期.较大的资源投入,所以一般的企业不会去自己开发,而是选择一些开源方案或第三方api. 开源方案中