Android 自动填写短信验证码 两种实现(二)

原创 2016年06月16日 20:25:07

使用内容观察者

1. 创建一个内容观察者

public class MyContentObserver extends ContentObserver {

    private Handler mHandler;//更新ui线程
    private Activity mActivity;//上下文
    /**
     * Creates a content observer.
     *
     * @param handler The handler to run {@link #onChange} on, or null if none.
     */
    public MyContentObserver(Handler handler,Activity activity) {
        super(handler);
        this.mHandler=handler;
        this.mActivity=activity;
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);




        //数据库发生改变时调用
        Uri uri= Uri.parse("content://sms/");
        //获取ContentResolver对象
        ContentResolver contentResolver=mActivity.getContentResolver();
        Cursor cursor = contentResolver.query(uri, new String[]{"address","body"}, null, null, null);
        if(cursor!=null) {
            cursor.moveToFirst();

            ContentValues values = new ContentValues();
            values.put("read", "1");        //修改短信为已读模式

            String address=cursor.getString(0);
            String body=cursor.getString(1);

            Pattern pattern=Pattern.compile("(\\d{6})");
            Matcher matcher=pattern.matcher(body);
            if(matcher.find()){
                String code=matcher.group(0);
                Toast.makeText(mActivity, "验证码:"+code, Toast.LENGTH_SHORT).show();
                mHandler.obtainMessage(1,code).sendToTarget();
            }
            cursor.close();//关闭游标
            mActivity.getContentResolver().unregisterContentObserver(this);//注销内容观察者

        }
    }
}

2. 在MainActivity 中注册内容观察者

public class MainActivity extends AppCompatActivity {
    private TextView mTvContent;
    private ContentResolver mContentResolver;

    private Handler mHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what==1){
                String string= (String) msg.obj;
                mTvContent.setText(string);
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTvContent= (TextView) findViewById(R.id.content);
        mContentResolver=getContentResolver();
        Uri uri= Uri.parse("content://sms/");
        //注册内容观察者
        mContentResolver.registerContentObserver(uri,true,new MyContentObserver(mHandler,this) );
    }

}

3 权限

 <uses-permission android:name="android.permission.READ_SMS"/>

4 Demo

链接:http://pan.baidu.com/s/1o7JrM8i 密码:apa2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mixi9760/article/details/51694426
收藏助手
不良信息举报
您举报文章:Android 自动填写短信验证码 两种实现(二)
举报原因:
原因补充:

(最多只允许输入30个字)