Android短信相关

1.读取短信

Uri inboxUri = Uri.parse("content://sms/inbox");
Cursor c = MainActivity.this.getContentResolver().query(inboxUri, null, null, null, "date desc");
if (c != null) {
    if(c.moveToFirst()){
               while (!c.isLast())
                  {
                 // 获取手机号
                 String address = c.getString(c.getColumnIndex("address"));
                 // 获取短信内容
                  String body = c.getString(c.getColumnIndex(“body"));
                 //对获取到的内容进行处理
                 //………………………………….

                 SMS sms = new SMS(address, body);
                  list.add(sms);
                  c.moveToNext();//移到下一行
                    }
           }
      c.close();
}

2.自动获取短信验证码

1.新建短信的订阅者

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;

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) {
        // 第一次回调 不是我们想要的 直接返回
        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("+8618102380000")) {
                    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();
    }
}

上面表示当受到新的短信的时候,如果短信的号码是指定的那个,就通知handler

2.有了订阅者,那肯定就是要注册。

Activity中注册。

 SMSContentObserver smsContentObserver = new SMSContentObserver(MainActivity.this, handler);
        MainActivity.this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, smsContentObserver);

注意:

1.要考虑动态权限





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值