首先来张截图(使用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();
}
}
}
}