美文网首页android自定义控件android系统控件高级
Android自动填写短信验证码,支持6.0系统。超简单,纯菜鸟

Android自动填写短信验证码,支持6.0系统。超简单,纯菜鸟

作者: 一只文艺猿猿猿 | 来源:发表于2016-12-18 17:19 被阅读1695次

    本案例超级简单,不深挖内部具体实现,只简单说下怎么使用,本猿菜鸟水平,代码也是网上扒的,但是针对6.0需要加几个权限,大神请路过~废话不多说直接上手,本文最后附源码链接。

    先看看效果吧:

    1111.gif

    第一步:添加权限:


    <uses-permission android:name="android.permission.READ_SMS" /><uses-permission>
    //android 6.0以上系统要加这个权限,否则程序会崩溃
    `<android:name="android.permission.READ_EXTERNAL_STORAGE" />


    第二步:新建SMSContentObserver类,这个类主要做短信验证码的监听的手机号或者服务号,手机号一定要加上"+86"(如“+86131123456789”)这个字段,如果是服务号号码不固定,请用正则表达式判断前几位。这用正则表达式判断联系6位数字为验证码,手机号是写死的。

    import android.content.Context;
    import android.database.ContentObserver;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Handler;
    import android.util.Log;import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    /**
    * 短信验证码截取 *
    * @author yangfan *
    */

    public class SMSContentObserver extends ContentObserver{
    private Context mContext; // 上下文
    private Handler mHandler; // 更新UI线程
    private String code; // 验证码
    public SMSContentObserver(Context context, Handler handler) { super(handler);
    mContext = context;
    mHandler = handler; }
    /**
    * 回调函数, 当所监听的Uri发生改变时,就会回调此方法 *
    * 注意当收到短信的时候会回调两次 *
    * @param selfChange
    *此值意义不大 一般情况下该回调值false */

    @Override public void onChange(boolean selfChange, Uri uri) { Log.e("XXXXXXXXXXXXXXXX", uri.toString());
    // 第一次回调 不是我们想要的 直接返回
    if (uri.toString().equals("content://sms/raw")) {
    return; }
    // 第二次回调 查询收件箱里的内容
    Uri inboxUri = Uri.parse("content://sms/inbox");
    // 按时间顺序排序短信数据库
    Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
    if (c != null) {
    if (c.moveToFirst()) {
    // 获取手机号
    String address = c.getString(c.getColumnIndex("address"));
    // 获取短信内容
    String body = c.getString(c.getColumnIndex("body"));
    // 判断手机号是否为目标号码,服务号号码不固定请用正则表达式判断前几位。
    if (!address.equals("+86目标手机号,这里一定要有'+86'这个字段")) {
    return;
    }
    // 正则表达式截取短信中的6位验证码
    Pattern pattern = Pattern.compile("(\d{6})");
    Matcher matcher = pattern.matcher(body);
    // 如果找到通过Handler发送给主线程
    if (matcher.find()) {
    code = matcher.group(0);
    mHandler.obtainMessage(1, code).sendToTarget();
    }
    }
    }
    c.close();
    }

    第三步:MainActivity直接调用就ok啦:

    //新建 handler
    @SuppressLint("HandlerLeak")Handler handler = new Handler() { @Override public void handleMessage(Message msg) {
    if (msg.what == 1) {
    tvCode.setText(msg.obj.toString());
    }
    }};

    @Override
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
    SMSContentObserver smsContentObserver = new SMSContentObserver( MainActivity.this, handler); MainActivity.this.getContentResolver().registerContentObserver( Uri.parse("content://sms/"), true, smsContentObserver);
    }


    简单3步就搞定了,是不是很简单~

    源代码地址:http://www.jianshu.com/p/3f0718e8f603/comments/2132975
    详情请移步~


    快趁热喝了这碗鸡汤:

    • 既然选择了Android开发这条路,你我就注定需要经历磨难挫折,
    • 一个人负责一个项目的压力,无人分担,
    • 你现在经历的,都是大牛经历过的,没人能走捷径,
    • 不都说不成魔,难成佛,
    • 我们都一样,风雨同舟,同舟共济,一起在路上!
    • 如果你也是只小菜鸟,请加入我们共同的巢穴,我们需要你!

    菜鸟部落:366213170(Q群)

    相关文章

      网友评论

      • yuyu000:在魅族手机上 , 无法监听到短信变化 。 广播和ContentObserver 均无法监听 (华为和模拟器可以监听)。
        大佬可知如何解决?
      • cf908b4323ca:这个实用。thanks
        一只文艺猿猿猿: @J2A 客气了~大家一起来源。
      • 安浪创想:这代码怎么没有格式?手机上看太乱了唉
        安浪创想: @一名文艺猿 这个功能还没用过呢,我去电脑上看下
        一只文艺猿猿猿: @绿血贵族 对,放在简书上都有点乱了,你可以直接复制到ide里面,格式化一下会比较好。

      本文标题:Android自动填写短信验证码,支持6.0系统。超简单,纯菜鸟

      本文链接:https://www.haomeiwen.com/subject/ncoamttx.html