• 开源App之MyHearts(二)


    前言

    小弟技术有限,有的地方也是自己摸索出来的,可能和大神们写的好的代码没法比,但是我会努力的。要对自己说下,加油!!

    此次更新

    1、集成QQ登录完成

    集成QQ登录网上写的介绍已经很多了,这里就不详细介绍,就写下自己遇到的坑。

      //QQ的初始化
            mTencent = Tencent.createInstance("app_id(申请的)", this.getApplicationContext());
            mInfo = new UserInfo(this, mTencent.getQQToken());

    在点击登录按钮调用以下代码:

      mTencent.login(this, "all", loginListener);
    
        IUiListener loginListener = new BaseUiListener() {
            @Override
            protected void doComplete(JSONObject values) {
                Log.d(TAG, "ruolanmingyue:" + values);
                Log.d("SDKQQAgentPref", "AuthorSwitch_SDK:" + SystemClock.elapsedRealtime());
                initOpenidAndToken(values);
    
                //下面的这个必须放到这个地方,要不然就会出错   哎,,,,,调整了近一个小时,,,,我是服我自己了
                updateUserInfo();
            }
        };
    
    
        public static void initOpenidAndToken(JSONObject jsonObject) {
            try {
                String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
                String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
                String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
                if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires)
                        && !TextUtils.isEmpty(openId)) {
                    mTencent.setAccessToken(token, expires);
                    mTencent.setOpenId(openId);
                }
            } catch (Exception e) {
            }
        }
    
        private class BaseUiListener implements IUiListener {
    
            @Override
            public void onComplete(Object response) {
                if (null == response) {
                    Util.showResultDialog(LoginActivity.this, "返回为空", "登录失败");
                    return;
                }
                JSONObject jsonResponse = (JSONObject) response;
                if (null != jsonResponse && jsonResponse.length() == 0) {
                    Util.showResultDialog(LoginActivity.this, "返回为空", "登录失败");
                    return;
                }
                doComplete((JSONObject) response);
            }
    
            @Override
            public void onError(UiError e) {
                Util.toastMessage(LoginActivity.this, "onError: " + e.errorDetail);
    
            }
    
            @Override
            public void onCancel() {
                Util.toastMessage(LoginActivity.this, "onCancel: ");
    
            }
    
            protected void doComplete(JSONObject values) {
    
            }
        }

    以上就能够吊起QQ客户端登录,然后获取用户信息(具体可以查看demo,最后会贴上地址的,不要急哈)

    2、注册登录实现(利用Bmob作为后台,mob的短信验证)

    在这里,mob的短信验证集成就不多说了,他们官方的demo也是比较详细的,代码量也比较多,贴在这里不雅,还不如直接git呢,哈哈,是不。
    注册,我这里使用的是Bmob后台管理,详情可以查看,这里看下代码,应该是很好理解的。

     /**
         * 进行注册
         */
        private void doRegister() {
            String userName = mEditName.getText().toString().trim();
            final MyUser myUser = new MyUser();
            if (RegularUtils.isUsername(userName)) {
                myUser.setUsername(userName);
                myUser.setPassword(pwd);
                myUser.setMobilePhoneNumber(phone);
                addSubscription(myUser.signUp(new SaveListener<MyUser>() {
                    @Override
                    public void done(MyUser myUser, BmobException e) {
                        if (e == null) {
                            Toast.makeText(RegisterSecondActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                            PreferencesUtils.putString(RegisterSecondActivity.this,Contants.USER_NAME,userName);
                            PreferencesUtils.putString(RegisterSecondActivity.this,Contants.USER_PASSWORD,pwd);
                            startActivity(new Intent(RegisterSecondActivity.this, LoginActivity.class));
                        } else {
                            //注册失败
                        }
                    }
                }));
            }
        }
    3、用户详情界面

    用户详情界面,除了UI界面代码比较多,逻辑还是挺简单的,就是获取到当前用户。

    每当你应用的用户注册成功或是第一次登录成功,都会在本地磁盘中有一个缓存的用户对象,这样,你可以通过获取这个缓存的用户对象来进行登录:
    mCurrentUser = MyUser.getCurrentUser(MyUser.class);

    然后就是根据这个用户对象,获取你需要展示的逻辑了。
    这里就不多说,代码还是直接取git,down下来运行,会受益颇多,git界面最后又怎么导入项目的指导。

    4、更新用户信息界面

    对于更新用户界面,在这里,字段定义的比较多。大家可以看下。

      private Integer age;  //年龄
        private Integer num;  //
        private Boolean sex;  //性别
    
        private String imgurl;  //图片地址
        private String instance;  //地址
        private String profession;  //职业
        private String bloodtype;  //血型
        private String love;  //爱好
        private String des;  //描述
        private int userfans;  //fans数量
        private String constellation;  //星座
        private String label;  //标签

    当然,对于用户名,密码,是在他的父类中进行了定义,(MyUser这个类要继承与BmobUser才能使用的哈)
    对于年龄、性别这里使用了第三方弹框。项目地址 
    compile 'cn.qqtheme.framework:WheelPicker:1.1.2'
    职业采用的第三方,依赖地址:

    compile 'com.afollestad.material-dialogs:commons:0.9.0.2'

    再次再次感谢此次用到的开源的项目的作者,没有他们的开源,也不会有这个MyHearts开源。
    当获取到所有的已经编辑好的用户信息的时候,调用以下代码就可以完成更新

     String objectId = mCurrentUser.getObjectId();
     
      user.update(objectId, new UpdateListener() {
                @Override
                public void done(BmobException e) {
                    if (e == null) {
                        CustomPrograss.disMiss();
                    }
                }
            });

    对于更新用户头像,可以查看下我之前的一个圆形图片,里面有启用相册或者相机的https://github.com/wuyinlei/CircleImgae
    这里更新用户头像,使用的是Bmob的另一个类。BmobFile,这里看下代码

                //头像本地地址
                final BmobFile bmobFile = new BmobFile(new File(path));
                //
                bmobFile.uploadblock(new UploadFileListener() {
    
                    @Override
                    public void done(BmobException e) {
                        if (e == null) {
                            Toast.makeText(UserActivity.this, "pic is success", Toast.LENGTH_SHORT).show();
                            // MyUser myUser =MyUser.getCurrentUser(MyUser.class);
                            //得到上传的图片地址
                            String fileUrl = bmobFile.getFileUrl();
                            mCurrentUser.setImgurl(fileUrl);
                            //更新图片地址
                            mCurrentUser.update(mCurrentUser.getObjectId(), new UpdateListener() {
                                @Override
                                public void done(BmobException e) {
                                    if (e == null) {
                                        Toast.makeText(UserActivity.this, "update", Toast.LENGTH_SHORT).show();
    
                                    }
                                }
                            });
                        }
                    }
                });

    在这里有个比较重要的,本来用户城市,想要整一个三级联动,但是,想着是不是可以尝试以下,选择城市的那种,右侧有侧边栏的指引的,然后就实现了,不过在前期数据库写入本地的时候,出现了一些问题,造成写入,找不到数据库文件。还好最后解决了。代码过多,就不贴了。还是那一句话,down代码,自己运行,这样看着代码,运行着程序,如有不明白的自己调试,也可以和我交流。虽然这更新的不是挺多,但是代码量还是挺可观的(。。。。)

    看下最近更新的功能吧,图形应该比较直观




    代码传送门

    https://github.com/924587628/MyHearts.git

    写在最后

    基本上,本项目也就差不多了,其他的除了(即时通讯、直播),其他的页面逻辑都差不多,即时通讯,接下来就是自己学习的一个重点了,等学好了,有时间就会在次app基础上进行增加功能。直播也在以后接触之后,会慢慢更新。这也算是对自己的一个小总结,也是接下来重大任务的起始点。加油。如果有任何疑问,都可以进行交流。

  • 相关阅读:
    rabbitMQ交换机的发布订阅模式
    Winforms平台界面开发技巧分享:增强的MVVM功能
    VCL分析工具DevExpress VCL全新发布v19.2.7
    Winforms界面开发v20.1——兼容.Net Core 5
    ASP.NET界面开发技巧放送,轻松自定义Grid运行时编辑表单布局
    现代Web开发堆栈工具DevExtreme 2020年首发v20.1.3
    Web界面开发工具!Kendo UI for jQuery数据管理:虚拟滚动
    Winforms平台界面开发技巧分享:Data Grid和Tree List悬停行外观
    现代Web开发堆栈工具DevExtreme——增强UI小部件功能
    界面控件套包DevExpress 2020年首发v20.1.3
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6006601.html
Copyright © 2020-2023  润新知