Подтвердить что ты не робот

Как зарегистрировать нового пользователя в XMPP, используя (a) Библиотека Smack

Я установил сервер xmpp и клиент android

4b9b3361

Ответ 1

Я решил это, создав веб-сервис, который берет имя пользователя и пароль как параметры сообщения. Если мы разместим имя пользователя и пароль, веб-сервис зарегистрирует нового пользователя.

Вместо того, чтобы подписаться с приложения, я обнаружил, что это довольно просто...

Ответ 2

У Smack есть функция регистрации InBand, которая может использоваться через класс AccountManager. Обратите внимание, что не каждый сервер имеет эту функцию, реализованную/включенную.

Ответ 3

Возможно, я опаздываю, но если вы используете последний smack-android:4.1.0, вы можете попробовать использовать код ниже для создания объекта XMPPTCPConnectionConfiguration connection и зарегистрировать пользователя:

// Creating a connection
XMPPTCPConnectionConfiguration connConfig =
        XMPPTCPConnectionConfiguration.builder()
                .setHost("myHost.com")  // Name of your Host
                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                .setPort(5222)          // Your Port for accepting c2s connection
                .setDebuggerEnabled(true)
                .setServiceName("myServiceName")
                .build();
AbstractXMPPConnection connection = new XMPPTCPConnection(connConfig);

try {
    // connecting...
    connection.connect();
    Log.i("TAG", "Connected to " + connection.getHost());

    // Registering the user
    AccountManager accountManager = AccountManager.getInstance(connection);
    accountManager.sensitiveOperationOverInsecureConnection(true);
    accountManager.createAccount(username, password);   // Skipping optional fields like email, first name, last name, etc..
} catch (SmackException | IOException | XMPPException e) {
    Log.e("TAG", e.getMessage());
    xmppClient.setConnection(null);
}

Ответ 4

Просто продумайте, что опубликовала Flow. AccountManager класс содержит все компоненты для ведения учетных записей пользователей в XMPP

Предположим, что у вас создан объект соединения.

AccountManager accountManager=new AccountManager(connection);
try {
    accountManager.createAccount("username", "password");
} catch (XMPPException e1) {
    Log.d(e1.getMessage(), e1);
}

Ответ 5

Это слишком поздно, но надеюсь, что это поможет

           XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration
                    .builder();
            config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
            config.setServiceName("nouman.test");
            config.setHost(serverAddress);
            config.setPort(5222);
            config.setDebuggerEnabled(true);
            XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
            XMPPTCPConnection.setUseStreamManagementDefault(true);
            config.setSendPresence(true);
            config.setDebuggerEnabled(true);
            config.setSendPresence(true);
            config.setCompressionEnabled(false);
            connection = new XMPPTCPConnection(config.build());
            connection.connect();


 AccountManager accountManager = AccountManager.getInstance(connection);
        Map<String, String> attributes = new HashMap<>();
        attributes.put("name", "full_name");
        attributes.put("email", "email");
        try {
            if (accountManager.supportsAccountCreation()) {
                accountManager.sensitiveOperationOverInsecureConnection(true);
                accountManager.createAccount("username","password", attributes);
                isAccountCreated = true;
            }
        } catch (Exception e) {
            //TODO : Case 409 or Message conflict is the case of username exist handle the case
            LogUtil.printStackTrace(e);
        }

Убедитесь, что у вас есть правильное имя службы, иначе вы получите ошибку с неправильным запросом.

Ответ 6

Я хочу обновить ответ, чтобы отразить изменение в версии 4.0 версии Asmack. Connection.getAccountManager() теперь AccountManager.getInstance(XMPPConnection)

AccountManager accountManager=AccountManager.getInstance(connection);
try {
    accountManager.createAccount("username", "password");
} catch (XMPPException e1) {
    Log.d(e1.getMessage(), e1);
}

Ответ 7

Если вы использовали версию smack 4.1.0 или выше, конвертируйте свое имя пользователя в Localpart для создания новой учетной записи на сервере.

 public static void registration(String username,ICallBack iCallBack){

    AccountManager accountManager = AccountManager.getInstance(connection);
    try {
        if(accountManager.supportsAccountCreation()){
            accountManager.sensitiveOperationOverInsecureConnection(true);
            accountManager.createAccount(Localpart.from(username), username);
            iCallBack.onSuccess();
        }
    } catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | SmackException.NotConnectedException e) {
        iCallBack.onFailure(e);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (XmppStringprepException e) {
        e.printStackTrace();
    }

}