现在大部分的注册都是采用手机号码注册的,都要获取验证码进行验证才能注册,为了减少用户的操作,有些应用就会做自动填充验证码的功能。
需求有了,现在就看怎么实现了,有2种方法能监听到收到的短信,一种是通过广播,但是这种方式可能不是很可靠,因为会被有些应用拦截掉。所以这里采用第二种方式,利用ContentObserver,直接上代码。
public class SmsContent extends ContentObserver {
private ContentResolver mContentResolver=null;
SmsGetListener smsGetListener;
Uri inUri = Uri.parse("content://sms/inbox");
public SmsContent(Context context, Handler handler, SmsGetListener smsGetListener) {
super(handler);
mContentResolver = context.getContentResolver();
this.smsGetListener = smsGetListener;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
try {
Cursor cursor = mContentResolver.query(inUri, new String[]{"_id", "address", "read", "body"}, null, null, "date DESC LIMIT 1");
if (null != cursor && cursor.moveToFirst()) {
int smsbodyColumn = cursor.getColumnIndex("body");
String smsBody = cursor.getString(smsbodyColumn);
Log.d("TimWang", "onChange body : " + smsBody);
String vertiCode = getDynamicCode(smsBody);
if (!TextUtils.isEmpty(vertiCode)) {
if (smsGetListener != null) {
smsGetListener.OnGetSms(vertiCode);
}
// try {
// ContentValues values = new ContentValues();
// values.put("read", "0"); // 修改短信为已读
// int id = cursor.getInt(cursor.getColumnIndex("_id"));
// Uri updateIdUri = ContentUris.withAppendedId(inUri, id);
// mContentResolver.update(updateIdUri, values, null, null);
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}
if (null != cursor ) {
cursor.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取大于4位数字验证码
* @param str 短信内容
* @return 截取得到的大于等于4位动态密码
*/
private String getDynamicCode(String str) {
Pattern continuousNumberPattern = Pattern.compile("[0-9]{4,}");
Matcher m = continuousNumberPattern.matcher(str);
String vertiCode = "";
while (m.find()) {
vertiCode = m.group();
}
return vertiCode;
}
public interface SmsGetListener{
void OnGetSms(String sms);
}
}
这是自定义的ContentObserver,然后就在需要的地方使用。
首先在用的地方实现SmsGetListener接口
@Override
public void OnGetSms(String sms) {
mAuthCode.setText(sms);
}
在onCreate注册
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
initView();
smsContent = new SmsContent(this,new Hanlder(),this);
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, smsContent);
}
在onDestroy反注册
@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(smsContent);
}
完事。