マトリックス・ライオットの紹介
私の理解では、電子メールに似た分散型オープンソース チャット ツール: https://matrix.org/、無料サービス、オンライン有料サービス (プライベート ドメイン名をバインドできる) を使用するか、自宅で構築することができます。
XMPP に似ていますが、XMPP は期待に応えられず、本当に使いやすいクライアントはほとんどなく、テキストと画像以外の高度な機能には互換性がありません。
マトリックスは現在、json + HTTP (RESTful) に基づいており、グループの。自作サーバーも非常にシンプルです。
android、ios、ブラウザはすべて riot というソフトウェアを使用します (他のクライアントも存在します)。オンラインで https://riot.im https://matrixim.cc/ などを試してみてください (私が見つけた 2 つの FQ は遅いかもしれません。)
matrix のプロトコル変換プラグインも比較的完成されており、他のプラグインでも使用できます。 IRC XMPP 電子メール 交換を待ちます。
Matrix は現在人気があり、商用のクローズドソース ソフトウェアを置き換える機会を持っていますが、当時の xmpp と同じにならないことを願っています。
実際、要約として、Matrix についての私の理解を簡単に紹介しましたが、重要なのは Matrix SDK の使用です。わかりました、本題に移りましょう
マトリックスライオットサーバー
現在、同様のチュートリアルドキュメントはインターネット上に多数存在しますが、Android Matrix SDKの紹介同様、国内のものは比較的少ないです。
しかし、それでもチュートリアルを書きに来て、オープンソースとオープンの精神を称賛する熱心な学生がいます。
https://www.jianshu.com/p/5c445d8698a4
因为本次只着重介绍Android SDK ,
所以有需要帮助搭建服务端的同学可以加我微信 chason_win
マトリックス・ライオットからの重要なお知らせです!
Android Matrix Riot サンプル プログラムのコンパイル
Android Riot サンプル プログラムをコンパイルする場合、次のような依存パッケージをダウンロードできないため、コンパイルに失敗しやすくなります。
org.jitsi.react:jitsi-meet-sdk:2.2.2
幸運にもパッケージが正常にダウンロードできたとしても、依然として問題が発生します
com.facebook.react.modules.core.PermissionListener;
このクラスが見つからないと爆発します。検査の結果、反応ネイティブの依存関係が必要であることがわかり、バージョンが低すぎることはできません。後で誰でもダウンロードできるようにリリースします。お急ぎの場合は、 WeChat に私を追加していただければ、以下に書きます。
Android Matrix SDK モジュールのコンパイル
Android Matrix SDK は外部ネットワーク上にあるため、依存関係をダウンロードするときにダウンロードできないパッケージがあります。
react-native-webrtc-1.69.2-jitsi-2062090@aar
そのため、jar パッケージを手動でダウンロードしてプロジェクトに統合することができます。後でリリースします。緊急に必要な場合は、以下に記載されているように、WeChat で私に連絡してください。
Android マトリックス ライオット ログイン
これをすでに見たということは、準備作業は完了しているということですが、かなり複雑ですよね。1 日かけて、あらゆる方法を試しました。幸運です!
個人的には、これは登録後に言及すべきだと思いますが、登録に比べて非常に簡単なので、最初にこれを全員に覚えてもらい、達成感を与えてください。そうしないと、長時間手探りするのは少し不快になります。登録。
まずコードをアップロードします。
/*初始化*/
hsConfig = new HomeServerConnectionConfig.Builder()
.withHomeServerUri(Uri.parse(url))
.build();
loginRestClient = new LoginRestClient(hsConfig);
/**
* 使用账号密码进行登录
* @param userName
* @param password
*/
private static void login(String userName,String password){
loginRestClient.loginWithUser(userName, password, new ApiCallback<Credentials>() {
@Override
public void onNetworkError(Exception e) {
}
@Override
public void onMatrixError(MatrixError e) {
}
@Override
public void onUnexpectedError(Exception e) {
}
@Override
public void onSuccess(Credentials info) {
}
});
事前に登録したアカウントを使用してログインすると、成功後に onSuccess インターフェイスがコールバックされます。
メインイベントが近づいているので、先に休憩します...
Android マトリックス ライオット登録
高エネルギー早期警告
この登録では 4 つのインターフェイス、つまり 3 つの異なるインターフェイスを呼び出す必要があります。
コードを見てください!
public static void register() {
RegistrationParams params = new RegistrationParams();
params.username = "dazhaung01";
loginRestClient.register(params, new ApiCallback<Credentials>() {
@Override
public void onNetworkError(Exception e) {
Log.e(TAG, "onNetworkError: " + e.getMessage());
}
@Override
public void onMatrixError(MatrixError e) {
Log.e(TAG, "onMatrixError: " + e.toString());
Log.e(TAG, "onMatrixError errcode: " + e.errcode);
Log.e(TAG, "onMatrixError mStatus: " + e.mStatus);
if (TextUtils.equals(e.errcode, MatrixError.USER_IN_USE)) {
Log.d(TAG, "User name is used");
} else if (TextUtils.equals(e.errcode, MatrixError.UNAUTHORIZED)) {
Log.d(TAG, "UNAUTHORIZED");
} else if (null != e.mStatus && e.mStatus == 401) {
try {
if (registrationFlowResponse != null) {
Log.d(TAG, "registrationFlowResponse !=null ");
return;
}
registrationFlowResponse = JsonUtils.toRegistrationFlowResponse(e.mErrorBodyAsString);
//检查邮箱
doesServerRequireIdentityServerParam();
Log.d(TAG, "registrationFlowResponse ");
} catch (Exception castExcept) {
Log.e(TAG, "JsonUtils.toRegistrationFlowResponse " + castExcept.getLocalizedMessage(), castExcept);
}
// listener.onRegistrationFailed(ERROR_MISSING_STAGE);
// handler.sendEmptyMessage(1);
Log.d(TAG, "ERROR_MISSING_STAGE ");
} else if (TextUtils.equals(e.errcode, MatrixError.RESOURCE_LIMIT_EXCEEDED)) {
// listener.onResourceLimitExceeded(e);
Log.d(TAG, "onResourceLimitExceeded ");
} else {
// listener.onRegistrationFailed("");
Log.d(TAG, "onRegistrationFailed ");
}
}
@Override
public void onUnexpectedError(Exception e) {
Log.e(TAG, "onUnexpectedError: " + e.getMessage());
}
@Override
public void onSuccess(Credentials info) {
Log.e(TAG, "onSuccess: " + info.toString());
}
});
}
private static void doesServerRequireIdentityServerParam() {
loginRestClient.doesServerRequireIdentityServerParam(new ApiCallback<Boolean>() {
@Override
public void onNetworkError(Exception e) {
}
@Override
public void onMatrixError(MatrixError e) {
}
@Override
public void onUnexpectedError(Exception e) {
}
@Override
public void onSuccess(Boolean info) {
Log.e(TAG, "onSuccess info : " + info);
requestEmailValidationToken();
}
});
}
private static void requestEmailValidationToken(){
profileRestClient.requestEmailValidationToken(
"null",
"你的邮箱地址@qq.com",
"72916032-3204-4f9b-9602-72e136c7c3c6",
0,
/*nextLink*/null,
true,
new ApiCallback<RequestEmailValidationResponse>() {
@Override
public void onSuccess(RequestEmailValidationResponse info) {
clientSecret=info.clientSecret;
email=info.email;
sid=info.sid;
sendAttempt=info.sendAttempt;
Log.e(TAG, "onSuccess: " );
}
@Override
public void onNetworkError(final Exception e) {
Log.e(TAG, "onNetworkError: " );
}
@Override
public void onUnexpectedError(Exception e) {
Log.e(TAG, "onUnexpectedError: " );
}
@Override
public void onMatrixError(MatrixError e) {
Log.e(TAG, "onMatrixError: " );
// String errorMessage = null;
// if (TextUtils.equals(MatrixError.THREEPID_IN_USE, e.errcode)) {
// errorMessage = build3PidErrorMessage(context, R.string.account_email_already_used_error, null);
// } else {
// errorMessage = build3PidErrorMessage(context, R.string.account_email_error, e.getLocalizedMessage());
// }
//
// listener.onThreePidRequestFailed(errorMessage);
}
});
}
public static void registerRight() {
//--data $'
// {"auth":{"threepid_creds":
// {"client_secret":"359cef9b-f9c8-4359-b074-f84a7ed0b2e6",
// "sid":"1824741622"},
// "session":"KXoarSJvqbkvEtVCjEXorIPf",
// "type":"m.login.email.identity"},
// "initial_device_display_name":"移动设备",
// "password":"111111","username":"dazhuang8"}
// ' -H "User-Agent: Riot.im/0.9.13-dev(Linux; U; Android 7.0; SM-G9508 Build/NRD90; Flavour GooglePlay; MatrixAndroidSDK 0.9.36-dev)" '
// http://synapse-dev.gidepay.com/_matrix/client/r0/register' | python -m json.tool
RegistrationParams params = new RegistrationParams();
params.username = "dazhaung01";
params.password = "111111";
AuthParams authParams = getThreePidAuthParams(clientSecret, "",
sid, LoginRestClient.LOGIN_FLOW_TYPE_EMAIL_IDENTITY);
authParams.session=registrationFlowResponse.session;
params.auth=authParams;
loginRestClient.register(params, new ApiCallback<Credentials>() {
@Override
public void onNetworkError(Exception e) {
Log.e(TAG, "onNetworkError: " + e.getMessage());
}
@Override
public void onMatrixError(MatrixError e) {
Log.e(TAG, "onMatrixError: " + e.toString());
Log.e(TAG, "onMatrixError errcode: " + e.errcode);
Log.e(TAG, "onMatrixError mStatus: " + e.mStatus);
if (TextUtils.equals(e.errcode, MatrixError.USER_IN_USE)) {
Log.d(TAG, "User name is used");
} else if (TextUtils.equals(e.errcode, MatrixError.UNAUTHORIZED)) {
Log.d(TAG, "电子邮件还没有进行确认");
} else if (null != e.mStatus && e.mStatus == 401) {
Log.d(TAG, "mStatus");
try {
if (registrationFlowResponse != null) {
Log.d(TAG, "registrationFlowResponse !=null ");
return;
}
registrationFlowResponse = JsonUtils.toRegistrationFlowResponse(e.mErrorBodyAsString);
//检查邮箱
// doesServerRequireIdentityServerParam();
Log.d(TAG, "registrationFlowResponse ");
} catch (Exception castExcept) {
Log.e(TAG, "JsonUtils.toRegistrationFlowResponse " + castExcept.getLocalizedMessage(), castExcept);
}
// listener.onRegistrationFailed(ERROR_MISSING_STAGE);
// handler.sendEmptyMessage(1);
Log.d(TAG, "ERROR_MISSING_STAGE ");
} else if (TextUtils.equals(e.errcode, MatrixError.RESOURCE_LIMIT_EXCEEDED)) {
// listener.onResourceLimitExceeded(e);
Log.d(TAG, "onResourceLimitExceeded ");
} else {
// listener.onRegistrationFailed("");
Log.d(TAG, "onRegistrationFailed ");
}
}
@Override
public void onUnexpectedError(Exception e) {
Log.e(TAG, "onUnexpectedError: " + e.getMessage());
}
@Override
public void onSuccess(Credentials info) {
Log.e(TAG, " 注册成功 onSuccess: " + info.toString());
}
});
}
/**
* Format three pid params for registration request
*
* @param clientSecret
* @param host
* @param sid received by requestToken request
* @param medium type of three pid
* @return map of params
*/
private static AuthParams getThreePidAuthParams(final String clientSecret,
final String host,
final String sid,
final String medium) {
AuthParamsThreePid authParams = new AuthParamsThreePid(medium);
authParams.threePidCredentials.clientSecret = clientSecret;
authParams.threePidCredentials.idServer = host;
authParams.threePidCredentials.sid = sid;
return authParams;
}
ああ~快適
不快に感じたら、WeChat に私を追加してください。快適に過ごせるようにお手伝いします
チャソンウィン