基于openfire+smack开发Android即时聊天应用[二]-账号信息、添加好友、JID理解等

本文主要是介绍基于openfire+smack开发Android即时聊天应用[二]-账号信息、添加好友、JID理解等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于openfire+smack开发Android即时聊天应用[三]-账号信息、添加好友、JID理解等

  • 1、 获取账号的所有额外属性信息

/*** 获取账号的全部信息*/
private void getAccountAttributes() {try {Set<String> accountAttributes = AccountManager.getInstance(mConnection).getAccountAttributes();Iterator<String> iterator = accountAttributes.iterator();while(iterator.hasNext()){String trim = iterator.next().toString().trim();Log.e("Account", "获取账号信息成功===" + trim);}} catch (SmackException.NoResponseException e) {e.printStackTrace();Log.e("Account", "连接服务器失败");} catch (XMPPException.XMPPErrorException e) {e.printStackTrace();Log.e("Account", "该账户已存在");} catch (SmackException.NotConnectedException e) {e.printStackTrace();Log.e("Account", "服务器连接失败");}
}

上述几个属性中的name属性即为用户的昵称属性,另外用户账号名、密码是不在这些属性当中的,账号名可以理解为是JID,可以通过RosterEntry.getUser这个方法获取,关于JID的理解请看下面的介绍

  • 2、 获取当前登录用户的所有好友信息

/*** 获取当前登录用户的所有好友信息*/
private void getAllFriend() {if (!mConnection.isConnected()) {return;}Set<RosterEntry> set = Roster.getInstanceFor(mConnection).getEntries();Iterator<RosterEntry> iterator = set.iterator();while (iterator.hasNext()) {String st = iterator.next().toString();Log.e("getAllFriend", "获取当前登录用户的所有好友信息===" + st);}}
  • 3、 获取账户昵称

 /*** 获取账户昵称** @return*/
public void getAccountName() {if (mConnection.isConnected()) {try {String name = AccountManager.getInstance(mConnection).getAccountAttribute("username");Log.e("getFriend", "获取账户昵称===" + name);} catch (Exception e) {Log.e("getFriend", "获取账户昵称失败");}VCard vCard = new VCard();String firstName = vCard.getFirstName();Log.e("getFriend", "firstName==" + firstName);}
}
  • 4、 获取指定账号的好友信息 方法有问题
  • 格式 [user”@”]domain[“/”resource]

domain:服务器域名; user:用户名; resource:属于用户的位置或设备,比如是手机还是电脑
一个用户可以同时以多种资源与统一个XMPP服务器连接,完整的JID例子:zhangsan@gmail.com/iphone6s


/*** 获取指定账号的好友信息 有问题** @param username*/
private void getFriend(String username) {if (!mConnection.isConnected()) {return;}RosterEntry entry = Roster.getInstanceFor(mConnection).getEntry(username+"@"+mConnection.getServiceName());Log.e("getFriend", "域名===" + mConnection.getServiceName());String s = entry.toString();Log.e("getFriend", "获取指定账号的好友信息===" + s);
}
  • 5、 添加好友,可根据账号,昵称,组名

/*** 添加好友,可根据账号,昵称,组名*/
private void addFriend(String user) {if (mConnection.isConnected()) {try {Roster.getInstanceFor(mConnection).createEntry(user, null, null);Log.e("addFriend", "添加好友成功" + user);} catch (SmackException.NotLoggedInException e) {e.printStackTrace();Log.e("addFriend", "NotLoggedInException" + e);} catch (SmackException.NoResponseException e) {e.printStackTrace();Log.e("addFriend", "NoResponseException" + e);} catch (XMPPException.XMPPErrorException e) {e.printStackTrace();Log.e("addFriend", "XMPPErrorException" + e);} catch (SmackException.NotConnectedException e) {e.printStackTrace();Log.e("addFriend", "NotConnectedException" + e);}}
}
  • 6、 关于对JID的理解

我对JID的理解主要是根据我在基于smack开发即时通信聊天应用时遇到的几种情况做的一个归纳,我碰到的JID的介绍主要有三种:

每个用户的好友列表中有一个JID,这个可以根据Openfire后台管理系统可以看出来,如下图:Smack_JID上面图中可以清晰的看到每个好友都对应有一个JID,而在我通过addFriend(String user, String nickName, String groupName)这个方法添加好友的时候,参数用户账号user最终就变成了上面的JID,是没有包含@符号和后面的服务器名的,我称这种JID为好友JID,如管理员账号的JID为:admin。这个JID通过官方提供的接口RosterEntry.getUser是可以获取到的。
好友之间聊天时有一个JID,在我创建聊天窗口对象Chat时(怎么创建请看我下一篇文章),所传的参数也是JID,但是这个JID和上面的JID的值却又不是一样的,不然会创建失败,我们来看看官方API:

官方API中很明显的指出了参数为JID,但是我如果真的出好友列表中的JID的话创建聊天对象失败,必须这样传好友JID@ServiceName ,这是第二种JID,我称为聊天JID,比如和管理员聊天时的JID为:admin@192.168.0.108

好友之间传输文件时又有一个JID,在创建文件传输对象时也需要传递一个参数为JID,我们也来看看官方API

官方API中也显示了在获取文件传输对象时需要传递参数为JID,但是这个JID我给的是聊天JID的时候,根本创建不了文件传输对象,后来在网上查了半天,看到别人都在后面加了个Smack,我也试了下,结果竟然成功了,坑爹啊,反正我还没搞清楚这是为什么,格式是这样的:好友JID@ServiceNam/Smack,我称这种JID为文件传输JID,比如聊天时给管理员传文件时的JID为:admin@192.168.0.108/Smack

这篇关于基于openfire+smack开发Android即时聊天应用[二]-账号信息、添加好友、JID理解等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301116

相关文章

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA