使用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),允许通过不安全的连接进行创建用户等敏感操作

 

其他一些值得参考的资料

Localpart.java

Extensible Messaging and Presence Protocol (XMPP): Address Format

posted @ 2020-12-30 14:56  vocus  阅读(373)  评论(0编辑  收藏  举报