基于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理解等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/yin13753884368/article/details/72190926
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/301116

相关文章

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件