Android之文本框自动获取发送到手机的短信验证码

自动获取发送手机的短信验证码

    一般手机注册的时候会发送验证码,如果手机能把发送的验证码放到注册的文本框就不需要粘贴了,用户体验比较好,不废话,先爆照。

没有收到短信前图片:
Android之文本框自动获取发送到手机的短信验证码_第1张图片


收到短信之后的图片
Android之文本框自动获取发送到手机的短信验证码_第2张图片

原理:

          我们在需要操作UI的的activity里面注册短信监听,当有短信来的时候,触发了ContentObserver这里类里面的onchange()方法,然后通过筛选手机号码已经里面的内容和我要提取的内容,得到提取的数字字符串之后,我们再去更新UI。

第一步:

          写一个类继承ContentObserver类,然后从写onChange()方法,操作短信数据库,然后提取我们需要的短信里面的验证码,一般需要3个筛选条件

         1、筛选发送短信到我手机的号码

  //指定一个号码,只读取与他有关的新消息。
  private boolean checkPhone(String phone) {
  // TODO Auto-generated method stub
    String c_phone = "1060066";           //可修改成不同的号码,看个人情况而定。
    if(c_phone.equals(phone) )
      return true;
    return false; 
  }

       2、筛选发送到我手机短信里面的关键内容

         
    //指定一关键字符串,用来确认短信内容是我们想要去提取的
    private boolean checkString(String message)
    {
        if(TextUtils.isEmpty(message))
            return false;
        Pattern p = Pattern.compile(Constants.TelPHONECONTEXT);          //这个关键字符串可以自定义
        Matcher matcher = p.matcher(message);
        if(matcher.find())
            return true;
        return false;
    }
       上面关键的字符串我定义的是“您的短信验证码”,因为每次发过来的短信都有这几个字
      

     3、筛选出我需要的验证码(用正则表达式帅选)

  
    //匹配短信中的四个数字(验证码)
    private String patternCode(String patternContent)
    {
        if(TextUtils.isEmpty(patternContent))
            return null;
        Pattern p = Pattern.compile(patternCoder);
        Matcher matcher = p.matcher(patternContent);
        if(matcher.find())
            return matcher.group();
        return null;
    }
       上面的patternCoder 是“\\d{6}”,因为验证码是6位数的数字

下面是SMSContentObserver.java类
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;

import com.kuyu.kuxianghui.config.Constants;

//用来观察系统里短消息的数据库变化  ”表“内容观察者,只要信息数据库发生变化,都会触发该ContentObserver 派生类
public class SMSContentObserver extends ContentObserver {
    private static String TAG = "SMSContentObserver";
    private int MSG_OUTBOXCONTENT = 2 ;
    private String patternCoder = "\\d{6}";     //正则表达式
    private String strContent;                  //验证码内容
    private Context mContext  ;
    private Handler mHandler ;   				  //更新UI线程
    public SMSContentObserver(Context context,Handler handler) {
        super(handler);
        mContext = context ;
        mHandler = handler ;
    }
    /**
     * 当所监听的Uri发生改变时,就会回调此方法
     *
     * @param selfChange  此值意义不大 一般情况下该回调值false
     */
    @Override
    public void onChange(boolean selfChange){
        Log.i(TAG, "the sms table has changed");
        //查询收件箱里的内容
        Uri outSMSUri = Uri.parse("content://sms/inbox") ;
        Cursor c = mContext.getContentResolver().query(outSMSUri, null, null, null,"date desc");
        if(c != null){
            Log.i(TAG, "the number of send is "+c.getCount()) ;
            StringBuilder sb = new StringBuilder() ;
            c.moveToNext();
            String message = c.getString(c.getColumnIndex("body"));      // 短信内容
            String phone = c.getString(c.getColumnIndex("address"));	   //短信来源号码
            c.close();
            if(checkPhone(phone) && checkString(message))
            {
                String code = patternCode(message);
                if(!TextUtils.isEmpty(code))
                {
                    strContent = code;
                }
                mHandler.obtainMessage(Constants.MSG_OUTBOXCONTENT, sb.toString()).sendToTarget();
            }
        }
    }

    //指定一个号码,只读取与他有关的新消息。
    private boolean checkPhone(String phone) {
        // TODO Auto-generated method stub
        String c_phone = Constants.TELPHONE;           //可修改成不同的号码,看个人情况而定。
        if(c_phone.equals(phone) )
            return true;
        return false;
    }

    //指定一关键字符串,用来确认短信内容是我们想要去提取的
    private boolean checkString(String message)
    {
        if(TextUtils.isEmpty(message))
            return false;
        Pattern p = Pattern.compile(Constants.TelPHONECONTEXT);          //这个关键字符串可以自定义
        Matcher matcher = p.matcher(message);
        if(matcher.find())
            return true;
        return false;
    }
    //匹配短信中的四个数字(验证码)
    private String patternCode(String patternContent)
    {
        if(TextUtils.isEmpty(patternContent))
            return null;
        Pattern p = Pattern.compile(patternCoder);
        Matcher matcher = p.matcher(patternContent);
        if(matcher.find())
            return matcher.group();
        return null;
    }
    public String getstrContent()
    {
        return strContent;
    }
}

第二步:到更新UI的Activity里面注册监听,用handler更新UI


Register.java文件如下
public class RegisterActivity extends BaseActivity implements View.OnClickListener {
    private SMSContentObserver smsContentObserver;
    private EditText etUsername;
    private EditText etPwd;
    private EditText etConfirmPwd;
    private EditText etTelephone;
    private EditText etVerificationCode;
    private CheckBox cbAgree;
    private TextView agreePtotocl;
    private Button btGetVerificationCode;
    private Button btRegister;
    private boolean result = true;
    private int time = 60;
    private int count = 0;
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case Constants.MSG_OUTBOXCONTENT:
                    String outbox = smsContentObserver.getstrContent();//(String) msg.obj;
//                    etSmsoutbox.setText(outbox);
                    etVerificationCode.setText(outbox);
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        findViews();
        smsContentObserver = new SMSContentObserver(this, mHandler);
        registerContentObservers() ;
    }
    private void registerContentObservers() {
        Uri smsUri = Uri.parse("content://sms");
        getContentResolver().registerContentObserver(smsUri, true, smsContentObserver);
    }
  }

好了 so easy吧

你可能感兴趣的:(android,自动获取发送到手机的短信验证码)