Как зарегистрировать нового пользователя в XMPP, используя (a) библиотеку Smack - PullRequest
13 голосов
/ 18 декабря 2010

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

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

Ответы [ 8 ]

7 голосов
/ 25 мая 2016

Возможно, я опоздал, но если вы используете последнюю версию 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);
}
7 голосов
/ 21 августа 2011

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

4 голосов
/ 09 февраля 2017

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

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

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

4 голосов
/ 02 апреля 2013

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

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

1 голос
/ 28 ноября 2017

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

}
0 голосов
/ 17 сентября 2014

Я хочу обновить ответ, чтобы отразить изменения в библиотеке 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);
}
0 голосов
/ 07 января 2011

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

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

0 голосов
/ 18 декабря 2010

Вам необходимо реализовать в клиенте InBand Registration функциональность

...