真的很奇怪大家的复制粘贴功能,一篇自动获取手机验证码的文章各大平台争相转发,我以为很牛逼,到后来发现不能用,可能我技术不够吧,复制粘贴还不到家。
android 自动获取手机验证码好处 :① 用户不用自动输入, 方便操作
② 防止用户在别的手机上登录,保证一手机只能一个号
言归正传
先创建继承于ContentObserver的子类,用于监听信息数据库发生变化,有信息来就立马截取。
public class SMSContentObserver extends ContentObserver {
private static String TAG = "SMSContentObserver";
private String patternCoder = "\\d{5}"; //正则表达式
private String strContent; //验证码内容
private Context mContext ;
private Handler mHandler ; //更新UI线程
private String TELPHONE = "TMRTXMIN"; // 短信来源号码
private String TelPHONECONTEXT ="iViralLink"; // 短信内容 特殊关键字
// 8448631136
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")); //短信来源号码
Log.i(TAG,"message : "+message);
Log.i(TAG,"phone : "+phone);
c.close();
if(checkPhone(phone) &&checkString(message)){
String code = patternCode(message);
assert code != null;
if(!TextUtils.isEmpty(code) ){
strContent = code;
}
mHandler.obtainMessage(1, sb.toString()).sendToTarget();
}
}
}
//指定一个号码,只读取与他有关的新消息。
private boolean checkPhone(String phone) {
// TODO Auto-generated method stub
String c_phone = TELPHONE;
if(c_phone.equals(phone