Как зарегистрировать нового пользователя на XMPP с помощью (а) библиотеки Smack

StackOverflow https://stackoverflow.com/questions/4476867

  •  11-10-2019
  •  | 
  •  

Вопрос

Я настроил сервер XMPP и клиент Android Используя отличный пост здесь... У меня есть несколько предварительно определенных пользователей, настроенных на сервере XMPP, и я мог бы войти в систему с этими учетными данными.

Теперь, из моего приложения, я хочу зарегистрироваться в качестве новых пользователей на сервере XMPP через клиент Android. Кто -нибудь может предложить мне, как получить это ... любая помощь будет благодарна ... !!!

Это было полезно?

Решение 6

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

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

Другие советы

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

Может быть, я опоздал, но если вы используете последние smack-android:4.1.0, вы можете попробовать ниже код для создания XMPPTCPConnectionConfigurationS. 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);
}

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

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

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

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

           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);
        }

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

Если вы использовали 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();
    }

}

Я хочу обновить ответ, чтобы отразить изменение в версии библиотеки ASMACK 4.0. Connection.getAccountmanager () теперь accountmanager.getInstance (xmppConnection)

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

Вам нужно реализовать в клиенте Inband Registration функциональность

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top