Android的ContentObserver类,实现监听手机短信

本文介绍了一种自动监听并获取手机短信验证码的方法,适用于用户注册等场景。通过自定义SmsObserver类继承ContentObserver,实现短信内容变化时自动读取验证码,并通过Handler更新UI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的第一篇csdn博客文章,为了记录自己在Android领域的学习,同时也是为了以后忘记了查找方便。我是菜鸟,我只能以此方式来记忆。

实现的功能:

监听用户收到的验证码,可用于用户注册时或其他情形所收到的验证码自动填写到手机上。

一、新建一个类SmsObserver继承ContentObserver

/**
 * 第一步:SmsObser构造函数,调用时用
 * 第二步:重写onChange方法
 */
public class SmsObserver extends ContentObserver {
    private Context mContext;
    private Handler mHandler;

    /**
     * 第一步:构造函数
     */
    public SmsObserver(Context context, Handler handler) {
        super(handler);
        mContext = context;
        mHandler = handler;
    }

    /**
     * 第二步:重写onChange方法
     *
     * @param selfChange
     * @param uri
     */
    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);

        Log.d("TAG", "SMS has changed!");
        Log.d("TAG", uri.toString());
        //判断uri.toString()是否等于手机的短信库
        if (uri.toString().equals("content://sms/raw")) {
            return;
        }

        Uri inboxuri = Uri.parse("content://sms/inbox");

        Cursor cursor = mContext.getContentResolver().query(inboxuri,null,null,null,"date desc");
        if(cursor!=null){
            if(cursor.moveToFirst()){
                String address = cursor.getString(cursor.getColumnIndex("address"));//发件人地址(手机号)
                String body = cursor.getString(cursor.getColumnIndex("body"));//信息内容

                Log.d("TAG", "发件人为:" + address + " " + "短信内容为:" + body);
                Pattern pattern = Pattern.compile("(\\d{6})");//正则表达式,6位数字
                Matcher matcher = pattern.matcher(body);
                if(matcher.find()){
                    String code = matcher.group(0);
                    Log.d("TAG", "code is " + code);
                    mHandler.obtainMessage(MainActivity.MSG_RECEIVER_CODE,code).sendToTarget();
                }
            }
            cursor.close();//关闭游标
        }
    }
}
二、MainActivity中调用
/**
 * 第一步:初始化ContentObserver
 * 第二步:注册ContentObserver
 * 第三步:重写onPause()方法,取消注册ContentObserver
 * 第四步:Handler接收code更新主线程
 */
public class MainActivity extends AppCompatActivity {

    public static final int MSG_RECEIVER_CODE = 1;
    private EditText et_code = null;
    private SmsObserver mObserver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_code = (EditText) findViewById(R.id.et_code);
        mObserver = new SmsObserver(MainActivity.this,mHandler);
        Uri uri = Uri.parse("content://sms");
        getContentResolver().registerContentObserver(uri,true,mObserver);//注册ContentObserver
    }

    @Override
    protected void onPause() {
        super.onPause();
        getContentResolver().unregisterContentObserver(mObserver);//取消注册ContentObserver
    }

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(msg.what == MSG_RECEIVER_CODE){
                String code = (String) msg.obj;
                Log.d("TAG",code);
                et_code.setText(code);
            }
        }
    };
}
三、布局文件只加了一个EditText
<EditText
    android:id="@+id/et_code"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:text="验证码"
    android:layout_centerInParent="true"/>

四、不要忘了在mainfest文件中加入权限
<uses-permission android:name="android.permission.READ_SMS"/>
终于写完了,累死了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端梦工厂+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值