Android监听短信获取验证码

现在大部分的注册都是采用手机号码注册的,都要获取验证码进行验证才能注册,为了减少用户的操作,有些应用就会做自动填充验证码的功能。
需求有了,现在就看怎么实现了,有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);
    }

完事。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值