自动获取发送手机的短信验证码
一般手机注册的时候会发送验证码,如果手机能把发送的验证码放到注册的文本框就不需要粘贴了,用户体验比较好,不废话,先爆照。
没有收到短信前图片:
收到短信之后的图片
原理:
我们在需要操作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吧