Matrix Riot 介绍

我的理解是一个类似 Email 分布式的开源聊天工具:https://matrix.org/ ,可以用免费服务、线上付费服务(可以绑定私有域名),也可以自己在家搭建。
跟 XMPP 类似,不过 XMPP 不争气,真正好用的客户端很少,而且除文字图片之外的高级功能相互兼容不好。
matrix 目前基于 json + HTTP (RESTful),支持 群组端到端加密。自建服务器也很简单。

android, ios 和 浏览器 都用叫做 riot 的软件(也存在其他客户端)。线上试用 https://riot.im https://matrixim.cc/ 等等(我找的这两个不FQ可能比较慢。)
matrix 的协议转换插件也比较全,可以跟别家的 IRC XMPP Email 等等互通。

matrix 目前比较火,有机会取代商业闭源软件,希望不要跟当年 xmpp 一样。

其实综上所述,简单的介绍了下我对Matrix的理解,而我们所关心的,则是Matrix SDK 的使用, ok,进入正题

Matrix Riot 服务端

目前外网有很多类似的教程文档, 但国内目前比较少, 就如同介绍Android Matrix SDK 一般。

但仍有热心同学来书写教程, 向开源开放精神点赞!

https://www.jianshu.com/p/5c445d8698a4

因为本次只着重介绍Android SDK ,所以有需要帮助搭建服务端的同学可以加我微信  chason_win

Matrix Riot 的重要提醒!

Android Matrix Riot 示例程序编译

因 Android Riot 示例程序编译时, 很容易会因为依赖包下不来 导致编译失败,如:

org.jitsi.react:jitsi-meet-sdk:2.2.2

即使该包侥幸下成功,但仍有问题

com.facebook.react.modules.core.PermissionListener;

会爆出该类找不到, 经检查发现需要一个
react-native 的依赖,而且版本不能太低,后续我会放出来让大家下载,着急可以加我微信,在下面有写。

Android Matrix SDK Module 编译

因 Android Matrix SDK 身在外网,所以在下载依赖的时候, 有一个包实测是下不下来的!

[email protected]

所以我们可以手动下载jar包,集成到项目中去, 后续我会放出来,急用可以联系我微信,下面有写。

Android Matrix Riot 登录

如果你已经看到这里, 说明准备工作已经完成,挺复杂的吧? 我当时搞了一天, 各种办法都尝试过,你们算幸运的咯!

个人感觉这个应该是放在注册后面讲的, 但是因为他相对于注册来说极其简单, 所以让大家先学习这个,有点成就感, 不然一上来就摸索注册半天,有点难受。

先上代码:

/*初始化*/       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 Matrix Riot 注册

高能预警
此次注册需要调用四次接口,三个不同接口!

直接看代码吧!

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

啊~舒服

你不舒服加我微信,我来帮你舒服

chason_win

更多相关文章

  1. 浅谈Android系统开发中LOG的使用
  2. Android中Parcelable接口对比Serializable
  3. Android实现动态向Gallery中添加图片及倒影与3D效果示例
  4. Android之MVP架构模式_
  5. 为你的APK进行数字签名
  6. Android中 AIDL 的简单实用例子
  7. Android(安卓)Service更新UI的方法之AIDL
  8. android中简单搞定webservice接口访问,以及webservice简析
  9. Android:IPC之AIDL的学习和总结

随机推荐

  1. Android ImageView去掉周围的白边
  2. 关于一个android工程同时使用多个工程库,
  3. 从源码一次彻底理解Android的消息机制
  4. Android Google应用移植时包依赖关系
  5. Android积木之图片的生成和保存
  6. android上多样式文本的使用
  7. 给android设置代理
  8. [Android]CircleList 圆弧形 ListView
  9. android实现退出时关闭所有activity
  10. Android下载完文件打开