使用Smack库实现注册
即添加账户
参考文档相关
可以下载smack的源码包,里面有比较完善的smack的使用文档
在XMPP服务器上创建和管理账户使用AccountManager类,说明文档位于/javadoc/org/jivesoftware/smackx/iqregister/AccountManager.html
(
这里有个问题,AccountManager类在org.jivesoftware.smackx.iqregister包下,而该包位于smack-extensions-xx.jar包下。我之前添加依赖的时候使用的是:
使用的精简的smack包,应该改成:
compile "org.igniterealtime.smack:smack-android-extensions:4.3.0"
否则,将不能正确使用smack的AccountManager类;另外不要导入android.accounts的AccountManager类了,这是不对的。
具体也可以参考一下Smack 4.3 Readme and Upgrade Guide
)
根据这个文档,注册用户使用到的AccountManager类方法有
实现注册方法
①获得给定XMPPConnection的AccountManager实例
public static AccountManager getInstance(XMPPConnection connection)
②创建用户
createAccount(Localpart username, String password, Map<String,String> attributes)
或者:
createAccount(Localpart username, String password)
String类型转Localpart 可以通过
Localpart.from(username)
完整代码:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // login("admin","yourpassword") addUser("vocus","123456") } private fun conn():XMPPTCPConnection{ val addr:InetAddress = InetAddress.getByName("169.254.235.122") val config: XMPPTCPConnectionConfiguration = XMPPTCPConnectionConfiguration.builder() // .setUsernameAndPassword(username,password) .setXmppDomain("169.254.235.122") .setHost("169.254.235.122") .setHostAddress(addr) .setPort(5222) .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) // .setSendPresence(true) // .setDebuggerEnabled(true) .build() val conn=XMPPTCPConnection(config) //连接一下 conn.connect() return conn } //登录 private fun login(username:String,password:String){ Thread{ kotlin.run { val conn:XMPPTCPConnection = conn() try{ conn.login(username,password) println("登录成功...") }catch (e:Exception){ println("登录错误...") e.printStackTrace() } } }.start() } //添加用户 private fun addUser(username: String, password: String) { Thread{ kotlin.run { val conn:XMPPTCPConnection = conn() val accountManager:AccountManager= AccountManager.getInstance(conn) // var attrStr=accountManager.getAccountAttribute("admin") // if(attrStr!=null){ // println("属性值是$attrStr") // } accountManager.sensitiveOperationOverInsecureConnection(true) accountManager.createAccount(Localpart.from(username),password) } }.start() } }
运行之后:
或者查看数据库
可能遇到的错误和解决办法
错误提示一:
org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from 169.254.235.122: XMPPError: bad-request - modify
可能原因是服务器名称不对,我之前把服务器名称设置为127.0.0.1,出现这个错误,改为局域网ip地址之后,错误消失。需要修改可以参考
错误提示二
java.lang.IllegalStateException: Creating account over insecure connection
解决方案
设置sensitiveOperationOverInsecureConnection(true),允许通过不安全的连接进行创建用户等敏感操作
其他一些值得参考的资料
Extensible Messaging and Presence Protocol (XMPP): Address Format