音乐类软件LoveMusic开发(三)----登录界面

首先来张截图(使用adb命令截取,因此跟前面有些不一样),UI效果以后再改;EditText和Button为Github开源项目FlatUi(5.0以下实现一些5.0的特性);

本代码段主要实现输入移动号码,通过正则验证,通过后向服务器请求验证码,收到短信后自动读取短信内验证码,填入下方验证码区域,将此短信标记为已读(强迫症解脱了),点击登录向服务器请求验证,成功后保存返回用户信息并关闭当前Fragment;

具体代码如下,注释写的很明白了,使用到的字符串资源

<string name="illegalNum">请输入正确的移动手机号码</string>
<string name="sms_signature">【中国移动咪咕音乐】</string>
<string name="sms_pattern">您的验证码\\:(\\d+)</string>
<string name="login_success">登录已成功</string>


package com.jl.lovemusic.fragments;

import android.content.ContentValues;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.cengalabs.flatui.views.FlatButton;
import com.cengalabs.flatui.views.FlatEditText;
import com.jl.lovemusic.R;
import com.jl.lovemusic.base.FragmentBase;
import com.jl.lovemusic.utils.Constants;
import com.jl.lovemusic.utils.Log;
import com.jl.lovemusic.utils.Message;
import com.jl.lovemusic.utils.Utils;
import com.jl.lovemusic.web.WebService;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import de.greenrobot.event.EventBus;

/**
 * 
 */
public class FragmentLogin extends FragmentBase {
    private final static Log.ILogger L = new Log.ILogger() {
        @Override
        public String tag() {
            return "FragmentLogin";
        }

        @Override
        public int logLevel() {
            return Log.L_A;
        }
    };

    private FlatEditText mPhoneNumEt;
    private FlatEditText mCertiNumEt;
    private FlatButton mGainNumBtn;
    private FlatButton mLoginBtn;

    private String mPhoneNum = "";
    private String mValiCode = "";

    private SMSObserver mObserver;

    private View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.gainNum:
                    mPhoneNum = mPhoneNumEt.getText().toString();
                    if (isLegalPhoneNum(mPhoneNum)) {
                        getNumFromService(mPhoneNum);
                    }
                    break;
                case R.id.confirmLogin:
                    checkForLogining(mPhoneNumEt.getText().toString(),
                            mCertiNumEt.getText().toString());
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_login,null);

        mPhoneNumEt = (FlatEditText) v.findViewById(R.id.phoneNum);
        mCertiNumEt = (FlatEditText) v.findViewById(R.id.certiNum);
        mGainNumBtn = (FlatButton) v.findViewById(R.id.gainNum);
        mLoginBtn = (FlatButton) v.findViewById(R.id.confirmLogin);

        mGainNumBtn.setOnClickListener(mClickListener);
        mLoginBtn.setOnClickListener(mClickListener);

        mObserver = new SMSObserver(new Handler(),getActivity());

        setRetainInstance(true);
        return v;
    }

    @Override
    public void onResume() {
        super.onResume();
        getActivity().getContentResolver().registerContentObserver(
                Uri.parse("content://sms/"),true,mObserver
        );
    }

    @Override
    public void onPause() {
        super.onPause();
        getActivity().getContentResolver().unregisterContentObserver(mObserver);
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    /**
     * 从mPhoneNum读取移动号码 验证是否移动号段 是否合法手机号 向服务器请求验证码
     *
     * @param phoneNum 手机号
     */
    private void getNumFromService(String phoneNum){
        new WebService().getValiCode(getActivity(),phoneNum);
        Log.I(L,"--------正准备请求验证码------"+phoneNum);
    }

    /**
     * 向服务器发送请求验证登录
     */
    private void checkForLogining(String phoneNum,String valiCode){
        new WebService().checkValiCode(getActivity(),phoneNum,valiCode);
        Log.I(L,"------正在请求登录-------");
    }

    /**
     * 验证是否是移动手机号
     *
     * @param phoneNum 待检验手机号
     */
    private boolean isLegalPhoneNum(String phoneNum){

        if(!Pattern.matches("^\\d{11}$",phoneNum)){
            Utils.showMessage(getActivity(), R.string.illegalNum);
            return false;
        }

        if(!Pattern.matches("(^1(3[5-9]|5[012789]|8[2478])\\d+)|(^134[0-8]\\d+)",phoneNum)){
            Utils.showMessage(getActivity(),R.string.illegalNum);
            return false;
        }
        return true;
    }

    /**
     *EventBus 消息处理方法
     *
     * @param msg 自定义消息类
     */
    @Override
    public void onEventMainThread(Message msg) {
        switch (msg.message){
            case Constants.RSP_VALICODE:
                mValiCode = msg.mExtra;
                if(!TextUtils.isEmpty(mValiCode)){
                    mCertiNumEt.setText(mValiCode);
                }
                break;
            case Constants.RSP_CHECK_VALICODE:
                Utils.saveStringToSharedPreferences(getActivity(),mPhoneNum,msg.mExtra);
                Utils.showMessage(getActivity(), R.string.login_success);
                getActivity().getSupportFragmentManager().popBackStack();
            default:
                break;
        }
    }

    /**
     * 拦截咪咕音乐移动服务号发送的验证码短信 获取号码 自动填入 标记已读
     *
     */
    class SMSObserver extends ContentObserver{

        private Context mContext;

        public SMSObserver(Handler handler,Context context) {
            super(handler);
            mContext = context;
        }

        /**
         *监视服务号码短信数据库 提取验证码
         */
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);

//            查询SMS数据库 获取该服务号码内未读短信
            Cursor cursor = mContext.getContentResolver().query(
                    Uri.parse("content://sms/inbox"),new String[]{"_id","body","read"},
                    "address=? and read=?",new String[]{"10658830","0"},"date desc"
            );

//            处理短信数据
            if(cursor!=null){
                while(cursor.moveToNext()){
                    String id = cursor.getInt(cursor.getColumnIndex("_id"))+"";
                    String body = cursor.getString(cursor.getColumnIndex("body"));
                    Log.I(L,"-----本条短信内容为-----"+body);

                    if(body.contains(mContext.getString(R.string.sms_signature))){
                        Matcher m = Pattern.compile(mContext.getString(R.string.sms_pattern)).matcher(body);
                        if(m.find()){
                            String valiCode = m.group(1);
                            Message msg = new Message(Constants.RSP_VALICODE);
                            msg.mExtra = valiCode;
                            EventBus.getDefault().postSticky(msg);

//                            将此短信标记为已读状态
                            ContentValues values = new ContentValues();
                            values.put("read","1");
                            mContext.getContentResolver().update(Uri.parse("content://sms/inbox"),
                                    values,"_id=?",new String[]{id});
                        }
                    }

                }
                cursor.close();
            }
        }
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值