新普金娱乐网址


本人之2017「音乐篇」

泡沫被,一些人数更加聪明,另一对人口虽越是产生钱

让您的 Android 应用为会促膝交谈(第二版)

  • 八月 30, 2018
  • 地理
  • 没有评论

1)勘测类

相当底文件聊天

咱先行由极度简便易行的环入手,看看怎么用 LeanCloud IM SDK v2
实现一对一文本拉扯。

简单易行科普:

图像信息(AVIMImageMessage)

AVIMFileMessage
子类,专门为此来发送图像以及附带文本的插花消息,其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMImageMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMImageMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 实例,构造消息对象
public AVIMImageMessage(AVFile file);

出殡图像信息的示范代码为:

String localImagePath;
try {
  AVIMImageMessage message = new AVIMImageMessage(localImagePath);
  message.setText("你说我好看不?");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

接过及这般消息之后,开发者可以通过如下方法,获取到几何图像元数据(width,height,图像
size)和一个含有图像数据的 AVFile 对象:

  • int getWidth() 方法会返回图像的肥瘦(单位:pixel)
  • int getHeight() 方法会返回图像的惊人(单位:pixel)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会返回一个图像文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会返回图像文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会返回图像文件的骨子里尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会返回随图像一起发送的公文信息。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以落图像的其余元数据信息。

一言九鼎工作

初始化

同 LeanCloud 其他服务一样,实时聊天服务的初始化也是以 Application 的
onCreate 方法中展开的:

public class MyApplication extends Application{

    public void onCreate(){
      ...
      AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
      ...
    }
}

又在AndroidManifest.xml中间声明:

<manifest>
   ...

   <application
        android:name=".MyApplication"
        ....>
        ...

        <service android:name="com.avos.avoscloud.PushService" />

        <receiver android:name="com.avos.avoscloud.AVBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
        ...
   </application>

</manifest>

紧接下去我们需要好用户登录。

0大问题,小答案

安扩大自己的富媒体消息

继续给
AVIMTypedMessage,开发者也得以扩展自己之富媒体消息。其要求以及步骤是:

  • 实现新的音类型,继承自 AVIMTypedMessage。这里需要小心少接触:
    • 每当 class 上加码一个 @AVIMMessageType(type=123) 的
      Annotation,具体信息类型的值(123)由开发者自己说了算(LeanCloud
      内建的消息类型应用负数,所有正数都养给开发者扩展使用)。
    • 每当信息中属性上使加 @AVIMMessageField(name=””) 的
      Annotation,name
      也而摘字段于宣称字段属性,同时于定义的字段要发生相应之
      getter/setter 方法。
  • 调用
    AVIMMessageManager.registerAVIMMessageType(Class<? extends AVIMTypedMessage> messageType)
    函数进行项目注册
  • 调用
    AVIMMessageManager.registerMessageHandler(Class<? extends AVIMMessage> clazz, MessageHandler<?> handler)
    函数进行信息处理 handler 注册。

AVIMTextMessage 的源码如下,可供参考:

@AVIMMessageType(type = -1)
public class AVIMTextMessage extends AVIMTypedMessage {

  @AVIMMessageField(name = "_lctext")
  String text;
  @AVIMMessageField(name = "_lcattrs")
  Map<String, Object> attrs;

  public String getText() {
    return this.text;
  }

  public void setText(String text) {
    this.text = text;
  }

  public Map<String, Object> getAttrs() {
    return this.attrs;
  }

  public void setAttrs(Map<String, Object> attr) {
    this.attrs = attr;
  }
}

时下准为测绘工程人数比多,其他两课目前发展也正如快.

群组消息未打扰(仅针对 iOS 平台用户中)

不管是只是聊还是群聊,对于发朝普通的 Conversation
的便消息,如果接收方当前不在线,LeanCloud 云端支持通过 Push
Notification
的章程进行提示。一般情形下就还是可怜好之,但是要某个群组特别活泼,那离线用户就会见吸收过多的推送,会形成不小的扰乱。

本着这个 LeanCloud IM 服务吗允许单个用户来关闭/打开某个对话的离线推送功能。

b.整个行业前行和市场行情、国家政策涉及密切,不应一视同仁,应该是阶段性的,参见国家煤炭行业、建筑行业、钢铁行业的盛衰。

创立开放聊天室

和平常的群组类似,建立一个开聊天室也是十分粗略的,只是于
AVIMClient.createConversation(conversationMembers, name, attributes, isTransient, callback)
中我们用传入 isTransient=true 选项。例如:

Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_Group);
imClient.createConversation(clientIds, name, attr, true, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了,进入聊天室
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

创立成功以后,我们就算可进入聊天界面了。开放聊天室的其他操作,都跟一般群组操作一样。

测绘工程工程为主,地信、遥感内业为主,但内业不对等轻松和出差少;其实工作性质无所谓好坏,萝卜白菜各有所爱。

对话成员变动响应接口

重在用于处理对话中成员变动的波,接口定义在
AVIMConversationEventHandler,主要函数为:

  /**
   * 实现本方法以处理聊天对话中的参与者离开事件
   *
   * @param members 离开的参与者
   * @param kickedBy 踢人者,自愿退出的情况下踢人者就是参与者
   */
  public abstract void onMemberLeft(AVIMClient client,
      AVIMConversation conversation, List<String> members, String kickedBy);

  /**
   * 实现本方法以处理聊天对话中的参与者加入事件
   *
   * @param members 加入的参与者
   * @param invitedBy 邀请人,有可能是加入的参与者本身
   */
  public abstract void onMemberJoined(AVIMClient client,
      AVIMConversation conversation, List<String> members, String invitedBy);

  /**
   * 实现本方法来处理当前用户被踢出某个聊天对话事件
   *
   * @param kickedBy 踢出你的人
   */
  public abstract void onKicked(AVIMClient client, AVIMConversation conversation,
      String kickedBy);

  /**
   * 实现本方法来处理当前用户被邀请到某个聊天对话事件
   *
   * @param conversation 被邀请的聊天对话
   * @param operator 邀请你的人
   */
  public abstract void onInvited(AVIMClient client, AVIMConversation conversation,
      String operator);

通过
AVIMMessageManager.setConversationEventHandler(AVIMConversationEventHandler handler)
可以装全局的 ConversationEventHandler。

适用对象:男生,且应努力,女生慎入。PS:的确发生女生做外业,但一般两年之内会积极离职。(或许半年内吧)

文件消息(AVIMFileMessage)

AVIMTypedMessage
子类,用来发送带附件的音讯,开发者可以用它来发送「离线文件」。对于此类消息,LeanCloud
IM SDK 内部会事先拿文件上传到 LeanCloud 文件存储服务器(自带 CDN
功能),然后拿文件首先数据(url,文件大小等等)放在信息包内发送至
LeanCloud 实时通信服务端。其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMFileessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMFileMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 实例,构造消息对象
public AVIMFileMessage(AVFile file);

与公事消息看似,文件消息吧支持附带文本及外自定义属性,可以经过如下方法上加
/ 获取更多信息:

  • String getText() / void setText(String text)
  • Map<String, Object> getAttrs() / void setAttrs(Map<String,
    Object> attr);

出殡文书消息之演示代码为:

String localZipfilePath;
try {
  AVIMFileMessage message = new AVIMFileMessage(localZipfilePath);
  message.setText("这是你要的文档");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

收下到如此消息之后,开发者可以透过以下方式,获取到文件首先数据(size
等)和一个分包二上制数据的 AVFile 对象:

  • AVFile getAVFile() 方法会返回一个二进制文件的 AVFile
    实例,之后可以经过 AVFile 来就多少下载或者其他操作,具体可参见
    AVFile
    说明
  • String getFileUrl() 方法会返回二进制文件之 url
  • long getSize() 方法会返回二进制文件的实际上尺寸(单位:byte)
  • Map<String, Object> getFileMetaData()
    可以得到二进制文件之任何元数据信息。

涉水,跋山跋涉;遇山打通,遇水搭桥;踏平坎坷上通道,斗过艰险而起身。

简介

由去年 LeanCloud
发布实时通信(IM)服务后,基于用户举报和工程师对急需的化以及针对工作的提炼,上周专业颁布了「实时通信
2.0
」。设计理念一如既往是「灵活、解耦、可做、可定制」,具体可参考《实时通信支出指南》,了解
LeanCloud 实时通信的基本概念和模型。

最主要武器:全站仪;目标:三维坐标。

在开放聊天室

假若任何极端用户都得投入开放聊天室。作为开发者,我们可由此通过特定条件检索到具备开放聊天室,然后允许用户擅自加盟,其演示代码为:

conversation.join(new AVIMConversationCallback(){
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,此时可以进入聊天界面了。。。
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

渴求计算机操作与编程能力

查询在线人数

通过 AVIMConversation.getMemberCount()
方法可以实时查询开放聊天室的在线人数。示例代码如下:

conversation.getMemberCount(new AVIMConversationMemberCountCallback(){
  @Override
  public void done(Integer memberCount, AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,此时 memberCount 的数值就是实时在线人数
    }
  }
});

知乎问题:#测绘行业如何?#

信息接收

当 Bob 这同端,要力所能及接收及消息,需要如下几步:

1,进行初始化;

2,实现好之 AVIMMessageHandler,响应新信息到达通知,主要是之类函数:

public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client);

对此 Tom 发过来的信,要出示出来,我们仅仅需要兑现 onMessage
即可,示例代码如下:

class CustomMessageHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 新消息到来了。在这里增加你自己的处理代码。
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }
}

3,进行登录,代码也同发送端一样。

整体代码如下:

// 自定义消息响应类
class CustomMessageHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 新消息到来了。在这里增加你自己的处理代码。
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }
}

// application 的初始化部分
public void onCreate(){
  ...
  AVOSCloud.initialize(this,"{{appId}}","{{appKey}}");
  AVIMMessageManager.registerDefaultMessageHandler(new CustomMessageHandler());
  ...
}

// 用户登录部分
AVIMClient imClient = AVIMClient.getInstance("Bob");
imClient.open(new IMClientCallback(){
  @Override
  public void done(AVIMClient client, AVException e) {
    if (null != e) {
      // 出错了,可能是网络问题无法连接 LeanCloud 云端,请检查网络之后重试。
      // 此时聊天服务不可用。
      e.printStackTrace();
    } else {
      // 成功登录,可以开始进行聊天了。
    };
  }
});

注意!
AVIMMessageManager.registerDefaultMessageHandler() 一定要以
AVIMClient.open() 之前调用,否则恐怕引致服务器发回去的一些信息丢失。

要求计算机操作与软件编程能力

得历史信息

LeanMessage 会将非暂态消息自动保存于云端,之后开发者可以通过
AVIMConversation 来得到该对话之所有历史信息。获取历史信息之 API 如下:

String oldestMsgId;
long oldestMsgTimestamp;
conversation.queryMessages(oldestMsgId,oldestMsgTimestamp, limit, new AVIMHistoryMessageCallback(){
  @Override
  public void done(List<AVIMMessage> messages, AVException e) {
    if (null != e) {
      // 出错了:(
    } else {
      // 成功,可以将消息加入缓存,同时更新 UI
    }
  }
});

注意:
获取历史信息之上,LeanCloud
云端是由某个修消息开始,往前方寻找开发者指定的 N
条消息,返回给客户端。为之,获取历史信息需要传入三个参数:起始消息的
msgId,起始消息之殡葬时间穿,需要获得的消息条数。

透过就无异于 API 拿到之音信就是是 AVIMMessage 还是 AVIMTypedMessage
实例数组,开发者可以像之前接受新信息通知一致处理。

5) 行业发展?

群组聊天

和前面的单聊类似,群组聊天吗要先成立一个对话(AVIMConversation),然后发送、接收新的音。

a.测绘工程

地理位置信息(AVIMLocationMessage)

AVIMTypedMessage
子类,支持发送地理位置信息与附带文本的混消息,其声明也:

public class AVIMLocationMessage extends AVIMTypedMessage {
  public String getText();
  public void setText(String text);

  public Map<String, Object> getAttrs();
  public void setAttrs(Map<String, Object> attr);

  public AVGeoPoint getLocation();
  public void setLocation(AVGeoPoint location);
}

以及公事消息看似,地理位置信息就是增加了一个 AVGeoPoint 的 Location
属性。要发送位置信息之以身作则代码为:

AVIMLocationMessage message = new AVIMLocationMessage();
message.setText("快点过来!");
message.setLocation(new AVGeoPoint(15.9, 56.4));
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("message sent");
    }
  }
});

收到至这般的消息随后,开发者可以得到实际的地理位置数据。

测绘分支学科主要发生测绘工程、地信和遥感。

文件消息(AVIMTextMessage)

AVIMTypedMessage 子类,表示一般的文件消息,其声明也

public class AVIMTextMessage extends AVIMTypedMessage {
  public String getText();
  public void setText(String text);

  public Map<String, Object> getAttrs();
  public void setAttrs(Map<String, Object> attr);
}

得看到,对于文本消息,主要的习性有 textattr 两只,通过简单的
getter/setter 就足以看到。要发送文书消息,示例代码为:

AVIMTextMessage message = new AVIMTextMessage();
message.setText("hello");
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("message sent.");
    }
  }
});

c.遥感

登录

假设聊天发起方名叫 Tom,为直观起见,我们采用用户名来作为 clientId
登录聊天系统(LeanCloud 云端只要求 clientId
在动内唯一即可,具体用啊数据由应用层决定),代码如下:

AVIMClient imClient = AVIMClient.getInstance("Tom");
imClient.open(new IMClientCallback(){
  @Override
  public void done(AVIMClient client, AVException e) {
    if (null != e) {
      // 出错了,可能是网络问题无法连接 LeanCloud 云端,请检查网络之后重试。
      // 此时聊天服务不可用。
      e.printStackTrace();
    } else {
      // 成功登录,可以开始进行聊天了(假设为 MainActivity)。
      Intent intent = new Intent(currentActivity, MainActivity.class);
      currentActivity.startActivity(intent);
    };
  }
});

a.什么怎么样?

盛开聊天室

放聊天室(也给暂态对话)可以用于很多地方,譬如弹幕、直播等等。在
LeanCloud IM SDK
中,开放聊天室是均等像样特殊之群组,它吧支持创造、加入/踢来成员等操作,消息记录会被保留并而供应获取;与一般群组不同等的地方具体体现吗:

  • 不支持查询成员列表,你得经过有关 API 查询在线人数;
  • 未支持离线消息、离线推送通知等力量;
  • 没成员加入、离开的通报;
  • 一个用户同样糟登录只能进入一个放聊天室,加入新的放聊天室后会自动离开原先的聊天室;
  • 参加后半小时内断网重连见面活动进入原聊天室,超过此时刻虽然需重新加入;

b.地信

几乎只至关重要的回调接口

起地方的例证中得望,要接纳到别人给你发送的音,需要重载
AVIMMessageHandler 类。从 v2 版开始,LeanCloud IM SDK
大量运回调来举报操作结果,但是于片消极之信息通知,则还是以接口来兑现之,包括:

  • 目前网出现转移
  • 对话中出新的消息
  • 对话中产生新成员参加
  • 对话中发出成员离开
  • 为请加入某对话
  • 于蹬来对话

LeanCloud IM SDK 内部用了三种接口来响应这些事件。

a.”怎么样“这仿佛问题我最怪,仁者见仁,只能就个人体会与解答。

下载和装

可以到 LeanCloud
官方下载点下载
LeanCloud IM SDK v2 本。将生充斥至之 jar 包加入工程即可。

变形监测

安接受富媒体消息

新版 LeanCloud IM SDK 内部封装了对富媒体消息之支持,所有富媒体消息都是起
AVIMTypedMessage 派生出的。发送的时节可一直调用
conversation.sendMessage()
函数。在接收端,我们为专门增加了平近似回调接口
AVIMTypedMessageHandler,其定义为:

public class AVIMTypedMessageHandler<T extends AVIMTypedMessage> extends MessageHandler<T> {

  @Override
  public void onMessage(T message, AVIMConversation conversation, AVIMClient client);

  @Override
  public void onMessageReceipt(T message, AVIMConversation conversation, AVIMClient client);
}

开发者可以编制好之音信处理 handler,然后调用
AVIMMessageManager.registerMessageHandler(Class<? extends AVIMMessage> clazz, MessageHandler<?> handler)
函数来报目标 handler。

接收端对于富媒体消息之通处理的示范代码如下:

class MsgHandler extends AVIMTypedMessageHandler<AVIMTypedMessage> {

  @Override
  public void onMessage(AVIMTypedMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    switch(message.getMessageType()) {
    case AVIMReservedMessageType.TextMessageType:
      AVIMTextMessage textMsg = (AVIMTextMessage)message;
      Logger.d("收到文本消息:" + textMsg.getText() + ", msgId:" + textMsg.getMessageId());
      break;
    case AVIMReservedMessageType.FileMessageType:
      AVIMFileMessage fileMsg = (AVIMFileMessage)message;
      Logger.id("收到文件消息。msgId=" + fileMsg.getMessageId() + ", url=" + fileMsg.getFileUrl() + ", size=" + fileMsg.getSize());
      break;
    case AVIMReservedMessageType.ImageMessageType:
      AVIMImageMessage imageMsg = (AVIMImageMessage)message;
      Logger.id("收到图片消息。msgId=" + imageMsg.getMessageId() + ", url=" + imageMsg.getFileUrl() + ", width=" + imageMsg.getWidth() + ", height=" + imageMsg.getHeight());
      break;
    case AVIMReservedMessageType.AudioMessageType:
      AVIMAudioMessage audioMsg = (AVIMAudioMessage)message;
      Logger.id("收到音频消息。msgId=" + audioMsg.getMessageId() + ", url=" + audioMsg.getFileUrl() + ", duration=" + audioMsg.getDuration());
      break;
    case AVIMReservedMessageType.VideoMessageType:
      AVIMVideoMessage videoMsg = (AVIMAudioMessage)message;
      Logger.id("收到视频消息。msgId=" + videoMsg.getMessageId() + ", url=" + videoMsg.getFileUrl() + ", duration=" + videoMsg.getDuration());
      break;
    case AVIMReservedMessageType.LocationMessageType:
      AVIMLocationMessage locMsg = (AVIMLocationMessage)message;
      Logger.id("收到位置消息。msgId=" + locMsg.getMessageId() + ", latitude=" + locMsg.getLocation().getLatitude() + ", longitude=" + locMsg.getLocation().getLongitude());
      break;
    }
  }

  @Override
  public void onMessageReceipt(AVIMTypedMessage message, AVIMConversation conversation, AVIMClient client) {
  }
}
MsgHandler msgHandler = new MsgHandler();
AVIMMessageManager.registerMessageHandler(AVIMTypedMessage.class, msgHandler);

LeanCloud IM SDK 内部消息分发的逻辑是这般的:对于收受的任一新消息,SDK
内部还见面先解析消息的型,根据项目找到开发者也这无异于路注册之拍卖
handler,然后依次调用这些 handler 的 onMessage
函数。如果无找到专门处理这等同种类消息之 handler,就会见传递给
defaultHandler 处理。

这样一来,在开发者也 TypedMessage(及其子类) 指定了专门的
handler,也指定了大局的 defaultHandler
了底当儿,如果发送端发送的是通用的 AVIMMessage 消息,那么受端就是
AVIMMessageManager.registerDefaultMessageHandler()中指定的 handler
被调用;如果发送的是 AVIMTypedMessage(及其子类)的消息,那么受端就是
AVIMMessageManager.registerMessageHandler()中指定的 handler 被调用。

大部分本科测绘工程出身女生改变命运的福音(考研)

纱事件响应接口

重要用来处理网络生成事件,接口定义在
AVIMClientEventHandler,主要函数为:

  /**
   * 实现本方法以处理网络断开事件
   */
  public abstract void onConnectionPaused(AVIMClient client);

  /**
   * 实现本方法以处理网络恢复事件
   */
  public abstract void onConnectionResume(AVIMClient client);

每当网中断的场面下,所有的信收发和对话操作都见面出现问题。

通过 AVIMClient.setClientEventHandler(AVIMClientEventHandler handler)
可以设定全局的 ClientEventHandler。

同等可本科误入测绘工程领域渴望改变命运轨迹的女生(考研)

支持富媒体的聊天消息

面的代码演示了什么样发送简单文本信息,但是现在的交互方式已经越来越多样化,图像、语音、视频已经是大广的信息类型。v2
版的 LeanCloud IM SDK 已经得以充分好地支撑这些富媒体消息,具体说明如下:

2哪些(只讲即状态)

消息应接口

重中之重用以处理新信息到达事件,接口定义在
MessageHandlerAVIMMessageHandler
是一个缺损的落实类似,我们应通过重载 AVIMMessageHandler
的系办法来就信息处理。主要的主意有:

  // 收到新的消息
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation);

  // 自己发送的消息已经被对方接收
  @Override
  public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client);

通过 AVIMMessageManager.registerDefaultMessageHandler(handler)
可以装全局的 MessageHandler。

咱们贯彻即三类似接口,就好拍卖所有的通知消息了。示例代码如下:

class CustomNetworkHandler extends AVIMClientEventHandler {
  @Override
  public void onConnectionPaused(AVIMClient client) {
    // 请按自己需求改写
    Logger.d("connect paused");
  }

  @Override
  public void onConnectionResume(AVIMClient client) {
    // 请按自己需求改写
    Logger.d("connect resume");
  }
}

class CustomConversationHandler extends AVIMConversationEventHandler {
  public private Context gContext = null;
  private void toast(String str) {
    Toast.makeText(gContext, str, Toast.LENGTH_SHORT).show();
  }
  private void toast(Context context, String str) {
    Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onMemberLeft(AVIMClient client, AVIMConversation conversation, List<String> members, String kickedBy) {
    // 请按自己需求改写
    toast(MsgUtils.nameByUserIds(members) + " left, kicked by " + MsgUtils.nameByUserId(kickedBy));
    //注:MsgUtils 是一个辅助类,nameByUserIds 用来将 userId 转换成用户名
  }

  @Override
  public void onMemberJoined(AVIMClient client, AVIMConversation conversation, List<String> members, String invitedBy) {
    // 请按自己需求改写
    toast(MsgUtils.nameByUserIds(members) + " joined , invited by " + MsgUtils.nameByUserId(invitedBy));
    //注:MsgUtils 是一个辅助类,nameByUserIds 用来将 userId 转换成用户名
  }

  @Override
  public void onKicked(AVIMClient client, AVIMConversation conversation, String kickedBy) {
    // 请按自己需求改写
    toast("you are kicked by " + MsgUtils.nameByUserId(kickedBy));
  }

  @Override
  public void onInvited(AVIMClient client, AVIMConversation conversation, String operator) {
    // 请按自己需求改写
    toast("you are invited by " + MsgUtils.nameByUserId(operator));
  }
};

class CustomMsgHandler extends AVIMMessageHandler {
  @Override
  public void onMessage(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    String msgContent = message.getContent();
    Logger.d(conversation.getConversationid() + " 收到一条新消息:" + msgContent);
  }

  @Override
  public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client) {
    // 请按自己需求改写
    Logger.d("发往对话 " + conversation.getConversationid() + " 的消息 "+ message.getMessageId() +" 已被接收");
  }
}

// 设置事件响应接口
AVIMClient.setClientEventHandler(new CustomNetworkHandler());
AVIMMessageManager.setConversationEventHandler(new CustomConversationHandler());
AVIMMessageManager.registerDefaultMessageHandler(new CustomMsgHandler());

起伏观测

板消息(AVIMAudioMessage)

AVIMFileMessage
子类,专门就此来发送语音及附带文本的混杂消息,其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMAudioMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMAudioMessage(File localFile) throws FileNotFoundException, IOException;   
// 传入 AVFile 实例,构造消息对象
public AVIMAudioMessage(AVFile file);

出殡音频消息之以身作则代码为:

String localAudioPath;
try {
  AVIMAudioMessage message = new AVIMAudioMessage(localAudioPath);
  message.setText("听听我唱的小苹果:)");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

接纳到这样消息后,开发者可以经如下方法,获取到几文章频元数据(时长
duration、音频 size)和一个包含音频数据的 AVFile 对象:

  • double getDuration() 方法会返回音频的长短(单位:秒)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会返回一个音频文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会返回音频文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会返回音频文件的实际尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会返回随音频一起发送的文本信息。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以取音频的另元数据信息。

探寻群组

甭管是单聊,还是群聊,在 LeanCloud IM SDK
里面都是对话(Conversation)。我们给对话设置了如下几种特性:

  • conversationId,字符串,对话 id,只念,对话创建之后由于 LeanCloud
    云端赋予一个大局唯一的 id。
  • creator,字符串,对话创建者 id,只念,标识对话创建者信息
  • members,数组,对话参与者,这里记录了具备的参与者
  • name,字符串,对话之讳,optional,可用来对于群组命名
  • attributes,Map/Dict,自定义属性,optional,供开发者自己壮大用。

咱们提供了专门的切近,来寻觅一定的群组:通过 imClient.getQuery()
得到一个 AVIMConversationQuery 实例,然后调用
AVIMConversationQuery.wherexxx
多样措施来多约原则。例如要寻找时登录用户与的保有群聊对话,其代码为

// 搜索 Tom 参与的所有群组对话
List<String> clients = new ArrayList<String>();
clients.add("Tom");
AVIMConversationQuery conversationQuery = imClient.getQuery();
conversationQuery.containsMember(clients);

// 之前有常量定义:
// const int ConversationType_OneOne = 0;
// const int ConversationType_Group = 1;
conversationQuery.whereEqualTo("attr.type", ConversationType_Group);

conversationQuery.findInBackground(new AVIMConversationQueryCallback(){
  @Override
  public void done(List<AVIMConversation> conversations, AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      if (null != conversation) {
        Logger.d("找到了符合条件的 " + conversations.size() + " 个对话");
      } else {
        Logger.d("没有找到符合条件的对话");
      }
    }
  }
});

AVIMConversationQuery 中设置规范的主意及 AVQuery 类似。这里
conversationQuery.containsMember()
表示对话的分子中最少含有这些口,可用来因部分成员查找对话;与这个类似的还有一个
conversationQuery.withMembers()
则表示有且仅来这些成员,用来因所有成员查找目标对话;conversationQuery.whereXXX()
层层措施可用来限制对话名称与于定义属性,这里要强调的某些凡是,对于自定义属性的约原则,属性名一定要是因为
attr 开头,如上例所示,限定额外的 type 条件的上要指定的属于性名是
attr.type。具体可参见其头文件。

2)工作性质?

望群组发送信息

发送信息非常简单,与前单聊的场面平。

咱见面注意到,AVIMConversation 还有一个发送信息的法:

public void sendMessage(final AVIMMessage message, final int messageFlag,
      final AVIMConversationCallback callback)

如这里 flag 的概念有如下三种档次:

  • 暂态消息(AVIMConversation.TRANSIENT_MESSAGE_FLAG)。这种信息未会见吃自动保存(以后当史信息遭到无法找到她),也未支持延迟收,离线用户更无见面接收推送通知,所以适合用来开控制协议。譬如聊天过程遭到「某某正在输入中…」这样的状态信息,就符合通过暂态消息来发送。
  • 常备消息(AVIMConversation.NONTRANSIENT_MESSAGE_FLAG)。这种消息就是是咱最好常用之音讯类型,在
    LeanCloud
    云端会自行保存起来,支持延迟收及离线推送,以后在史信息遭到可以找到她。
  • 需要回执消息(AVIMConversation.RECEIPT_MESSAGE_FLAG)。这否是如出一辙栽平凡消息,只是消息被对方接到后
    LeanCloud 服务端会发送一个回执通知被发送方(这就是是
    AVIMMessageHandler 中
    public void onMessageReceipt(AVIMMessage message, AVIMConversation conversation, AVIMClient client)
    函数被调用的机会)。

1)收入?

成立对话

如若我们只要和「Bob」这个用户展开聊天,我们先行创造一个会话,代码如下:

List<String> clientIds = new ArrayList<String>();
clientIds.add("Tom");
clientIds.add("Bob");

// 我们给对话增加一个自定义属性 type,表示单聊还是群聊
// 常量定义:
// int ConversationType_OneOne = 0; // 两个人之间的单聊
// int ConversationType_Group = 1;  // 多人之间的群聊
Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_OneOne);

imClient.createConversation(clientIds, attr, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了,这时候可以显示对话的 Activity 页面(假定为 ChatActivity)了。
      Intent intent = new Intent(this, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      startActivity(intent);
    }
  }
});

树的「对话」在控制台怎么查

要是您所显现,我们创建一个对话之上,指定了成员(Tom 和
Bob)和一个外加的性({type: 0})。这些多少保存至云端后,你当
控制台 -> 存储 -> 数据 里面会相,_Conversation
表中多了一致漫漫记下,新记录的 m 属性值为["Tom", "Bob"]attr
属性值为{"type":0}。如你所预期,m 属性就是针对性诺在成员列表,attr
属性就是用户增加的脑门外属性值(以目标的款型储存)。

起2011年国家测绘局改名国家测绘地理信息局表明测绘行业的腾飞以及电脑联系更紧,具体发展及啊程度,who
knows and who cares。

成员管理

每当查询到聊天室成员之后,可以为用户约部分协调的心上人在,作为管理员也堪去除一些「可怕」的积极分子。
加入新成员的 API 如下:

// 假设需要邀请 Alex,Ben,Chad 三人加入对话
List<String> userIds = new ArrayList<String>();
userIds.add("Alex");
userIds.add("Ben");
userIds.add("Chad");
conversation.addMembers(userIds, new AVIMConversationCallback() {
  @Override
  public void done(AVException error) {
    if (null != error) {
      // 加入失败,报错.
      error.printStackTrace();
    } else {
      // 发出邀请,此后新成员就可以看到这个对话中的所有消息了。
      Logger.d("invited.");
    }
  }
});

约成功后,相关方收到通知之时序是如此的:

    操作者(管理员)                    被邀请者                        其他人
1, 发出请求 addMembers
2,                               收到 onInvited 通知
3, 收到 onMemberJoined 通知      收到 onMemberJoined 通知      收到 onMemberJoined 通知

对应地,踢人时常的调用 API 是:

List<String> userIds = new ArrayList<String>();
userIds.add("Alex");
conversation.kickMembers(userIds, new AVIMConversationCallback() {
  @Override
  public void done(AVException error) {
    if (null != error) {
      // 失败,报错.
      error.printStackTrace();
    } else {
      // 成功。
      Logger.d("kicked.");
    }
  }
});

踢人时,相关方收到通知之时序如下:

    操作者(管理员)                被踢者                       其他人
1, 发出请求 kickMembers
2,                          收到 onKicked 通知
3, 收到 onMemberLeft 通知                             收到 onMemberLeft 通知

注意!
倘若请、踢人操作发生的早晚,被邀请者/被踢者当前不在线,那么通知消息并无会见于离线缓存,所以他们重新上线的上将未见面收下通知。

显然不同级别都低收入不同,不要拿XX县跟北上广比,也决不用省会城市以及县级市于(直接盖数字对比毫无意义);总体而言整体收入可以,基本按照付出得到成正比原则。

启用离线消息推送(仅针对 iOS 平台用户中)

不论是一味聊还是群聊,当用户 A
发出消息继,如果目标对话中发出局部用户眼前不在线,LeanCloud
云端可以供离线推送的计来提醒用户。这无异于力量默认是倒闭的,你得于
LeanCloud 应用控制台中启它。开启方法如下:

  • 报到 LeanCloud 应用控制台,选择是的采取上;
  • 选料最好上方的「消息」服务,依次点击左边菜单「实时信息」->「设置」;
  • 以右「iOS
    用户离线时之推送内容」下填好而一旦推送出去的信息内容,保存;

诸如此类 iOS 平台达成之用户就足以收 Push Notification
了(当然,前提是采用本身申请到了 RemoteNotification
权限,也将科学的推送证书上传至了 LeanCloud 控制台)。

1测绘行业

基类:AVIMTypedMessage

持有富媒体消息之基类,其宣称也

//SDK定义的消息类型,LeanCloud SDK 自身使用的类型是负数,所有正数留给开发者自定义扩展类型使用,0 作为「没有类型」被保留起来。
enum AVIMReservedMessageType {
  UnsupportedMessageType(0),
  TextMessageType(-1),
  ImageMessageType(-2),
  AudioMessageType(-3),
  VideoMessageType(-4),
  LocationMessageType(-5),
  FileMessageType(-6);
};

public abstract class AVIMTypedMessage extends AVIMMessage {
  public AVIMTypedMessage();

  public int getMessageType();

  @Override
  public final String getContent();

  @Override
  public final void setContent(String content);
}

管制及,部门主任-单位主管;技术达到,项目经理-总工。

视频信息(AVIMVideoMessage)

AVIMFileMessage
子类,专门用来发送视频及附带文本的夹消息,其构造函数声明也:

// 传入本地文件路径,构造消息对象
public AVIMVideoMessage(String localPath) throws FileNotFoundException, IOException;
// 传入本地文件,构造消息对象
public AVIMVideoMessage(File localFile) throws FileNotFoundException, IOException;
// 传入 AVFile 文件,构造消息对象
public AVIMVideoMessage(AVFile file);

发送视频信息之言传身教代码为:

String localVideoPath;
try {
  AVIMVideoMessage message = new AVIMVideoMessage(localVideoPath);
  message.setText("敢不敢跟我比一比");
  conversation.sendMessage(message, new AVIMConversationCallback() {
    @Override
    public void done(AVException e) {
      if (null != e) {
        // 出错了。。。
        e.printStackTrace();
      } else {
        Logger.d("message sent");
      }
    }
  });
} catch (Exception ex) {
}

接至这样消息随后,开发者可以好由此如下方法,获取到多看到频元数据(时长
duration、视频 size)和一个富含视频数据的 AVFile 对象:

  • double getDuration() 方法会返回视频的长短(单位:秒)
  • AVFile getAVFile() (继承自
    AVIMFileMessage)方法会返回一个视频文件的 AVFile 实例
  • String getFileUrl() (继承自 AVIMFileMessage)方法会返回视频文件的
    url
  • long getSize() (继承自
    AVIMFileMessage)方法会返回视频文件的实在尺寸(单位:byte)
  • String getText() (继承自
    AVIMFileMessage)方法会返回随视频一起发送的文本信息。
  • Map<String, Object> getFileMetaData() (继承自
    AVIMFileMessage)可以落视频的别元数据信息。

2)监测(相对轻松,仍需要努力)

创立群组

跟单聊类似,建立一个大多人口拉的群组也是死粗略的。例如:

Map<String, Object> attr = new HashMap<String, Object>();
attr.put("type", ConversationType_Group);
imClient.createConversation(clientIds, attr, new AVIMConversationCreatedCallback() {
  @Override
  public void done(AVIMConversation conversation, AVException e) {
    if (null != conversation) {
      // 成功了!
      Intent intent = new Intent(currentActivity, ChatActivity.class);
      Intent.putExtra(“conversation”, conversation);
      currentActivity.startActivity(intent);
    }
  }
});

中标之后,我们便好入聊天界面了。

4)工作前景(一些废话)?

收到群组消息

收起一个群组的信息,与吸纳单聊的信呢是同的。

3) 就业?

出殡信息

树好对话后,要发送信息是甚简单的:

AVIMMessage message = new AVIMMessage();
message.setContent("hello");
conversation.sendMessage(message, new AVIMConversationCallback() {
  @Override
  public void done(AVException e) {
    if (null != e) {
      // 出错了。。。
      e.printStackTrace();
    } else {
      Logger.d("发送成功,msgId=" + message.getMessageId());
    }
  }
});

好了,这样同样长消息就发送过去了。但是问题来了,对于「Bob」而言,他怎么才能够吸纳别人发给他的音信啊?

b.最后想说,不管怎么样,行行出状元!

签署和平安

以满足开发者对权力和认证的要求,LeanCloud
还规划了操作签名的建制。我们可当 LeanCloud
应用控制台中之「设置」->「应用选项」->「聊天推送」下面勾选「聊天服务签约认证」来启用签名(强烈推荐这样做)。启用后,所有的用户登录、对话创建/加入、邀请成员、踢来成员等操作都需征签名,这样开发者就可以本着信息进行充分的主宰。

客户端即时边究竟欠怎么下也?我们惟有待贯彻 SignatureFactory
接口,然后在用户登录之前,把这接口的实例赋值给 AVIMClient
即可(AVIMClient.setSignatureFactory(factory))。

设定了 signatureFactory 之后,对于用鉴权的操作,LeanCloud IM SDK
与服务器端通讯的时候还见面带动上使自己变的 Signature 信息,LeanCloud
云端会动用 app 的 masterKey 来证明信息的管用,保证聊天渠道的安。

对此 SignatureFactory 接口,我们特需要贯彻就点儿只函数即可:

  /**
   * 实现一个基础签名方法 其中的签名算法会在SessionManager和AVIMClient(V2)中被使用
   */
  public Signature createSignature(String peerId, List<String> watchIds) throws SignatureException;

  /**
   * 实现AVIMConversation相关的签名计算
   */
  public Signature createConversationSignature(String conversationId, String clientId,
      List<String> targetIds, String action) throws SignatureException;

createSignature
函数会以用户登录的时刻被调用,createConversationSignature
会在对话创建/加入、邀请成员、踢来成员等操作时叫调用。

公得做的虽是按照前文所陈述之签算法实现签约,其中 Signature
声明如下:

public class Signature {
  public List<String> getSignedPeerIds();
  public void setSignedPeerIds(List<String> signedPeerIds);

  public String getSignature();
  public void setSignature(String signature);

  public long getTimestamp();
  public void setTimestamp(long timestamp);

  public String getNonce();
  public void setNonce(String nonce);
}

里头四个特性分别是:

  • signature 签名
  • timestamp 时间戳,单位秒
  • nonce 随机字符串 nonce
  • signedPeerIds 放行的 clientId 列表,v2 中已经扔不用

脚的代码展示了因 LeanCloud
云代码进行签约时,客户端的贯彻部分,你可参见其来成功好的逻辑实现:

public class KeepAliveSignatureFactory implements SignatureFactory {
 @Override
 public Signature createSignature(String peerId, List<String> watchIds) {
   Map<String,Object> params = new HashMap<String,Object>();
   params.put("self_id",peerId);
   params.put("watch_ids",watchIds);

   try{
     Object result =  AVCloud.callFunction("sign",params);
     if(result instanceof Map){
       Map<String,Object> serverSignature = (Map<String,Object>) result;
       Signature signature = new Signature();
       signature.setSignature((String)serverSignature.get("signature"));
       signature.setTimestamp((Long)serverSignature.get("timestamp"));
       signature.setNonce((String)serverSignature.get("nonce"));
       return signature;
     }
   }catch(AVException e){
     throw (SignatureFactory.SignatureException) e;
   }
   return null;
 }

  @Override
  public Signature createConversationSignature(String convId, String peerId, List<String> targetPeerIds,String action){
   Map<String,Object> params = new HashMap<String,Object>();
   params.put("self_id",peerId);
   params.put("group_id",convId);
   params.put("group_peer_ids",targetPeerIds);
   params.put("action",action);

   try{
     Object result = AVCloud.callFunction("group_sign",params);
     if(result instanceof Map){
        Map<String,Object> serverSignature = (Map<String,Object>) result;
        Signature signature = new Signature();
        signature.setSignature((String)serverSignature.get("signature"));
        signature.setTimestamp((Long)serverSignature.get("timestamp"));
        signature.setNonce((String)serverSignature.get("nonce"));
        return signature;
     }
   }catch(AVException e){
     throw (SignatureFactory.SignatureException) e;
   }
   return null;
  }
}

LeanCloud IM SDK
专注做好底层的报导服务,有重复多得定制化的地方,譬如说:

  • 账户体系及 IM 系统是分手之;
  • 消息成为离线推送的时节,推送内容开发者是得定制的;
  • 透过 web hook,开发者可以对信息进行双重多处理;
  • 闲谈过程中经过信息鉴权机制,开发者可以产生更多控制;

盖缺 UI
组件,实事求是地说话在初用户接入成本可能小强,但是以事情范围壮大、产品需要变换多事后,相信大家见面进一步喜欢
LeanCloud 这种自由灵活的采取体验,以及稳定快速的劳动品质。

最主要武器:水准仪;目标:高程。

大把就业机会,只是挑选问题(个人一定和职业规划必然在十分十分距离);该规范设置高校的频频增加一定程度达到反应了就业需求。

笔者保留权利

一言九鼎做项目前期地形地势测量;

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图