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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#