基于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

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间