Как зарегистрировать нового пользователя на XMPP с помощью (а) библиотеки Smack
Вопрос
Я настроил сервер XMPP и клиент Android Используя отличный пост здесь... У меня есть несколько предварительно определенных пользователей, настроенных на сервере XMPP, и я мог бы войти в систему с этими учетными данными.
Теперь, из моего приложения, я хочу зарегистрироваться в качестве новых пользователей на сервере XMPP через клиент Android. Кто -нибудь может предложить мне, как получить это ... любая помощь будет благодарна ... !!!
Решение 6
Я решил его, разработав веб -сервис, который принимает имя пользователя и пароль в качестве параметров Post. Если мы опубликуем имя пользователя и Pasword, веб -сервис регистрирует нового пользователя.
Вместо того, чтобы подписаться из приложения, я обнаружил, что это довольно просто ...
Другие советы
Smack имеет функциональность регистрации Inband, которая может использоваться через Менеджер по работе с клиентами учебный класс. Обратите внимание, что не каждый сервер имеет эту функцию реализована/включена.
Может быть, я опоздал, но если вы используете последние smack-android:4.1.0
, вы можете попробовать ниже код для создания XMPPTCPConnectionConfiguration
S. 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 функциональность