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

原创 2015年11月18日 09:47:36

项目下载地址:https://github.com/townkoim/Andorid_Goty_Im_

说明:项目为一个商业项目、有在各大市场上线.里面包含了,第三方登录,分享,推送、即时IM聊天功能

android加入即时聊天的功能. 

对比了融云、环信(主要对比了价格,小公司以经济实惠为主),最终还是选择了亲加、
第一步:进入http://www.gotye.com.cn/ 亲加。注册后台并登陆,在注册应用的时候,我这里选择“开放注册”,开放注册的好处就是,客户端可以根据用户的唯一ID,首次登陆亲加后台会自创建一个新用户,而第二次登陆的时候就会使用上一次登陆创建之后的用户名。
注意:一定要是客户端提供的唯一ID

在创建成功之后..看一下应用,应用概况这一栏目,会显示你注册之后的APPKEY等相关信息,在IM用户选项,会显示,你已经注册过的IM的用户


下一步--http://www.gotye.com.cn/download.html,在这里下载即时通讯API的安卓开发包(因为没接入语音通信,所以不需要下载语音通信API)
解压之后,将相对应的Jar文件以及.so库文件放到工程中,想对应的文件夹下

下一步:在adt-eclipse的安卓项目中集成亲加(根据亲加提供的api文档:http://www.gotye.com.cn/docs/ime/android.html)

1、在Mainfest文件中加入以下权限
    <uses-permission android:name ="android.permission.INTERNET" />
    <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name ="android.permission.RECORD_AUDIO" />
    <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name ="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name= "android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name ="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name ="android.permission.READ_CONTACTS" />

2、在自定义的application中初始化亲加,就是注册亲加到我的APP当中

     //使用您在亲加管理平台申请到的appkey初始化API,appkey如果为空会返回参数错误。
          //context为android上下文环境
          //下文提到的gotyeApi即为GotyeAPI,后续不再赘述。
      GotyeAPI gotyeApi = GotyeAPI. getInstance();
      gotyeApi.init(MainActivity. this, "28683ef9-6295-4939-895f-96fbffa81c25" );
注意:在application当中,应该将gotyApi设一个get方法或者用static修饰、以便全局都可以调用,如果需要开启语音识别功能,要添加这段代码--apiist.initIflySpeechRecognition();


3、登录注册亲加
     说明:亲加载进行改版之后,做了一个很大的变动,将所有的回调都放在了GotyeDelegate这个类当中,以前都是每个模块都有每个模块的接口(个人感觉,改版之后还没有之前设计的合理,不利于程序的扩展,但是这样又统一进行了封装,利于程序的优化)
     3.1 首先要进行注册
     注册的接口为:https://qplusapi.gotye.com.cn:8443/api/ImportUsers?email=登录亲加后台的账号&devpwd=登录亲加后台的账号&appkey=48377791-c431-4b0b-8372-26d0b95e7aa9&useraccount=?
     PS:这一步应该由服务器来做批量导入用户到亲加,但是我这边服务器没有做,所以只能通过在APP端,用户登录服务器的时候,去亲加注册一个账号,如果返回 {"errcode":200}字段,表示注册成功,如果返回 {"failedUsers":["13798477145"],"errcode":403},表示已经注册过了。

     3.2登录亲加
               gotyeApi.addListener( delegate);
             //因为在注册的时候没有假如密码的参数,所以这里登录的时候密码必须为Null,不能为空字符串,如需要密码,在之前注册的接口的用户名后面加上&&userpwd=密码
             gotyeApi.login( "13798477145", null);

            GotyeDelegate  delegate = new GotyeDelegate(){
                  public void onLogin( int code, com.gotye.api.GotyeUser user) {
                  
                 };
           };
      根据重写Login方法来得到登录的回调,根据code来判断是否登录成功,可以参考api文档中的GotyeStatusCode类判断code的错误码

 至此--亲加登录就算完成了.登录完成之后还有一部必须来进行实现:
  根据login的方法,可以看到返回了一个GotyUser对象, 在这里我们就可以改变这个User的一些属性,比如设置用的头像,设置用户的昵称,性别等
 

聊天模块

聊天的唯一的身份就是通过此ID。
先说一下此处的改变:在以前的版本中,会有一个GotyMessage父类-下面对应GoteTextMessage(普通文本)、GotyeImageMessage(图片)、GotyeRichTextMessage(声音)、GotyeVoiceMessage(二进制文本)
,用来构成MVC模式中的Model体系、但是在这个版本中--就只有了一个GotyeMessage对象了。通过GotyeMessageType枚举类,来判断发送或者接受的是什么类型的消息

讲解一下其中会用到的几个关键的类
     GotyeChatTarget  类---聊天对象的父类,聊天肯得要有一个对象,一个用户是一个对象,一个聊天室也是一个对象、一个聊天群组也是一个对象,
     所以在该类中有三个对象GotyeGroupGotyeRoomGotyeUser,根据类的名字应该知道 这三个类是三个实体类,对应的 群组、聊天室、用户的实体类,
     所以在不同的场合,需要GotyeChatTarget  对象的时候,根据业务需求来new 它的子类即可。

    GotyeDelegate类:
     所有的回调都在此类当中、所有的发送消息都会回调在onSendMessage(int code, GotyeMessage message)方法中-在此处根据code的值来判断是否发送成功.

下面来讲解一下发送消息:
 发送普通文本消息
                    //构建GotyeMessage对象,第一个参数为发送者(可以省略),第二个参数为接受者。
                  GotyeMessage msg = GotyeMessage. createTextMessage(new GotyeUser("自己的唯一ID" ), new GotyeUser("对方身份的唯一ID"), "要发送的文本" );
                   //发送消息
                   gotyeApi.sendMessage(msg);
   

图片消息

创建图片消息:

String imagePath = “/mnt/sdcard /icon.jpg”; ///< 设定原始图片路径,目前仅支持jpg
GotyeMessage message = GotyeMessage.createImageMessage(receiver, imagePath);

自定义数据消息

自定义数据消息 API支持发送用户自定义数据:

byte[] userdata = “1234567890”.getBytes(); ///< 自定义数据内容不能超过4KB
GotyeMessage message = GotyeMessage.createUserDataMessage(receiver,userdata,len);

或者发送指定路径文件里的数据内容:

String path = “/mnt/sdcard /userdata.txt”; ///<文件内容不能超过4KB
GotyeMessage message = GotyeMessage.createUserDataMessage(receiver,path);

获取自定义数据(如果存在): byte[] data = message.getUserData();

语音消息

开始录音:在调用开始录音的时候,会触发GotyeDelegate类的onStartTalk(int code, boolean isrealtime, int targetType, GotyeChatTarget target)的回调方法,在这里我们记下当前的时间

gotyeApi.startTalk(user,WhineMode.Default,maxDuration); ///< 单聊api,user为聊天对象,WhineMode为语音变声参数,maxDuration为时长(单位ms) 
gotyeApi.startTalk(group,WhineMode.Default,maxDuration); ///< 群聊语音消息
gotyeApi.startTalk(room,WhineMode.Default,realtime,maxDuration);
///<realtime如果为true,则开始实时语音,聊天室所有用户会收到onRealPlayStart的回调

gotyeApi.stopTalk();
结束录音:在录音结束的时候,会触发GotyeDelegate类的onStopTalk(int code, GotyeMessage message, boolean isrealtime)的犯法,在这里,我们可以得到当前时间,减去刚才在onstartTalk中记下的时间、判断时间是否大于1S。(因为我在实际开发中,必须大于1S才允许发送)
然后在这个回调的方法里面。调用:

gotyeApi.sendMessage(message);///< 不调用发送消息方法消息是不会发送给对方的。但是该条语音消息会保存在本地。


OK,下面来看看接受消息:
接受主要是在onReceiveMessage(GotyeMessage message)方法中,在这里,我们可以通过message.getType(),(通过枚举 GotyeMessageType来判断
得到消息之后,我们就可以放到我们自己的ListView的适配器的数据源里面去了


下面来讲一下我的项目中微信聊天的布局的实现:
 我用一个ListView来显示聊天界面的所有消息, 聊天界面的消息 自己发送的消息在界面的右边,别人发送的消息在界面的左边.
于是我通过重写BaseAdapter的getViewTypeCount()方法,让他return 2; 返回两个布局。
以及重写getItemViewType(int position)方法, 在这个方法中,我通过ListView的数据源.getPosition(position) 方法,得到消息的实体类。 也就是GoteMessage对象。
在GotyeMessage对象中调用getSender()方法,得到这个用户,和我自己刚登陆亲加的时候的用户信息进行匹配,如果相同,说明是我自己是发送者,那么久return 右边的布局,反之...

接着就来讲一下语音,图片,文本的布局..这个比较简单。通过GotyeMessage对象的 GotyeMessageType判断,不同的类型加载不同的数据类型即可。


如果接受的消息是语音或者图片:

接收/下载 消息

下载消息:

gotyeApi.downloadMediaInMessage(message)///< 只有图片消息和语音消息需要下载

注意: 新收到的消息如果是图片或语音类型,图片和语音文件并不随消息一起到达接收方,需要手动调用该方法下载。

回调到GotyeDelegate 中的onDownloadMessage

void onDownloadMediaInMessage(int code, GotyeMessage message);

回调原型: void onDownloadMediaInMessage(int code, GotyeMessage message); /// <下载的消息,下载好的媒体文件在message.media.path或pathEx中













版权声明:本文为博主原创文章,未经博主允许不得转载。

腾讯IM即时通讯(2.4.1)

在https://www.qcloud.com/product/im中下载SDK、查看集成文档
  • Rlingge
  • Rlingge
  • 2016年11月30日 15:52
  • 3375

使用腾讯云IM遇到的问题

过年前来记录一下个人在使用腾讯云通信中遇到的问题,本文只说移动端的问题,由于本人是android开发的,所以以下出现腾讯API以android的为主,但ios也是对应方法名。如有说得不对,或者是我使用...
  • lanqi_x
  • lanqi_x
  • 2017年01月19日 22:58
  • 3180

简述集成腾讯即时通讯sdk的流程

今天整理了下之前在项目中集成腾讯即时通讯的过程欢迎遇到各种问题的朋友来一起探讨 首先,申请帐号神马的就不说了,直接代码部分 在项目的Application类中,通过如下代码做一个初始化 在登录的地方,...
  • qq_36877268
  • qq_36877268
  • 2017年07月27日 09:55
  • 469

腾讯云即时通讯聊天android开发demo与sdk指南

  • 2015年10月17日 10:29
  • 26.7MB
  • 下载

源码提供!Android即时通讯和sns开源项目汇总

博客原地址: Android即时通讯和sns开源项目汇总 这是一个整理即时通讯(IM)和社交系统(SNS)优秀开源项目的文档,项目上传github欢迎提交更新。 github地址:https://gi...
  • miaozhenzhong
  • miaozhenzhong
  • 2016年09月08日 11:34
  • 1562

android-使用环信SDK开发即时通信功能及源码下载

最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便、简洁,说明文档清晰易懂。文档有android、ios、和后台服务器端,还是非常全的。 环信官网:ht...
  • u010156024
  • u010156024
  • 2015年07月10日 09:32
  • 20887

实现从“环信”下载聊天记录,显示在本地项目页面的功能(三)—— 将解析后的数据保存到本地DB中

一、判断重复 每一句的聊天记录,在环信中都会有对应唯一的ID进行匹配,在保存到DB中时,要先判断这句聊天内容的 hxMsgId 是否在Id中已经存在,若存在就跳过。 /* * 下面代码解析entit...
  • hlbt0112
  • hlbt0112
  • 2016年03月11日 10:40
  • 1438

Android 高仿微信实时聊天 基于百度云推送

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38799363 ,本文出自:【张鸿洋的博客】一直在仿微信界面,今天终于有幸利用百度...
  • lmj623565791
  • lmj623565791
  • 2014年08月24日 23:00
  • 115977

Android即时聊天系统--随聊APP之接口定义

接口定义大约包括了登陆、添加联系人、设置联系人备注、删除联系人、发送文字消息、发送文件(用作发送语音和图片)、退出等接口。因当时想实现AIDL接口,让聊天服务在另一个新的线程中,为了方便,就没有设置获...
  • jav_imba
  • jav_imba
  • 2015年06月13日 15:17
  • 956

使用 HTML5 webSocket API实现即时通讯的功能

使用 HTML5 webSocket API实现即时通讯的功能
  • wangshuxuncom
  • wangshuxuncom
  • 2014年10月15日 11:52
  • 4131
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android接入即时IM(接入亲加通信云)
举报原因:
原因补充:

(最多只允许输入30个字)