项目下载地址: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文件中加入以下权限 [java] view plain copy
  1. <uses-permissionandroid:name="android.permission.INTERNET"/>
  2. <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. <uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>
  4. <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
  5. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
  6. <uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/>
  7. <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
  8. <uses-permissionandroid:name="android.permission.READ_CONTACTS"/>

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

[java] view plain copy
  1. //使用您在亲加管理平台申请到的appkey初始化API,appkey如果为空会返回参数错误。
  2. //context为android上下文环境
  3. //下文提到的gotyeApi即为GotyeAPI,后续不再赘述。
  4. GotyeAPIgotyeApi=GotyeAPI.getInstance();
  5. 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登录亲加 [java] view plain copy
  1. gotyeApi.addListener(delegate);
  2. //因为在注册的时候没有假如密码的参数,所以这里登录的时候密码必须为Null,不能为空字符串,如需要密码,在之前注册的接口的用户名后面加上&&userpwd=密码
  3. gotyeApi.login("13798477145",null);
  4. GotyeDelegatedelegate=newGotyeDelegate(){
  5. publicvoidonLogin(intcode,com.gotye.api.GotyeUseruser){
  6. };
  7. };
根据重写Login方法来得到登录的回调,根据code来判断是否登录成功,可以参考api文档中的 GotyeStatusCode 类判断code的错误码
至此--亲加登录就算完成了.登录完成之后还有一部必须来进行实现: 根据login的方法,可以看到返回了一个GotyUser对象, 在这里我们就可以改变这个User的一些属性,比如设置用的头像,设置用户的昵称,性别等
聊天模块
聊天的唯一的身份就是通过此ID。 先说一下此处的改变:在以前的版本中,会有一个GotyMessage父类-下面对应GoteTextMessage(普通文本)、 GotyeImageMessage(图片)、 GotyeRichTextMessage(声音)、 GotyeVoiceMessage(二进制文本) ,用来构成MVC模式中的Model体系、但是在这个版本中--就只有了一个 GotyeMessage 对象了。通过 GotyeMessageType枚举类 ,来判断发送或者接受的是什么类型的消息
讲解一下其中会用到的几个关键的类 GotyeChatTarget 类---聊天对象的父类,聊天肯得要有一个对象,一个用户是一个对象,一个聊天室也是一个对象、一个聊天群组也是一个对象, 所以在该类中有三个对象 GotyeGroup , GotyeRoom , GotyeUser,根据类的名字应该知道 这三个类是三个实体类,对应的 群组、聊天室、用户的实体类, 所以在不同的场合,需要GotyeChatTarget 对象的时候,根据业务需求来new 它的子类即可。
GotyeDelegate类: 所有的回调都在此类当中、所有的发送消息都会回调在 onSendMessage (intcode, GotyeMessage message)方法中-在此处根据code的值来判断是否发送成功.
下面来讲解一下发送消息: 发送普通文本消息 //构建GotyeMessage对象,第一个参数为发送者(可以省略),第二个参数为接受者。 GotyeMessage msg = GotyeMessage.createTextMessage( new GotyeUser( "自己的唯一ID" ), new GotyeUser( "对方身份的唯一ID" ), "要发送的文本" ); //发送消息 gotyeApi .sendMessage(msg);

图片消息

创建图片消息:

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

自定义数据消息

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

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

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

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

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

语音消息

开始录音:在调用开始录音的时候,会触发GotyeDelegate类的onStartTalk(intcode, booleanisrealtime, inttargetType,GotyeChatTargettarget)的回调方法,在这里我们记下当前的时间

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 (intcode, GotyeMessage message, booleanisrealtime)的犯法,在这里,我们可以得到当前时间,减去刚才在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中


更多相关文章

  1. Android知识梳理之Sqlite数据库的使用和优化
  2. Android中Broadcast Receiver组件具体解释
  3. Android消息机制理解
  4. Android(安卓)点击通知栏消息打开activity,并判断app是否运行
  5. 对手机厂商来说,“Android”并不是一个功能
  6. MTP 服务流程
  7. Android(安卓)call requires API level解决之刃
  8. Android消息机制——ThreadLocal(Android艺术开发探索读书笔记)
  9. Samsung 公佈可升級 Android(安卓)4.0 的名單

随机推荐

  1. 在Android中使用Timer,并创建一个应用程序
  2. android中设置activity的出现方式
  3. android之4.0控件switch自定义开关滑块、
  4. Android退出程序的多种方法
  5. 键盘自动弹出解决
  6. PackageManagerService简介
  7. android 开发中常用颜色,以及一些颜色的代
  8. android appwidget service的初始化
  9. Android保留两位小数方法
  10. 自定义自己的AlertDialog