Android短信相关

来源:互联网 发布:sql如何使用 编辑:程序博客网 时间:2024/06/04 19:20

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.要考虑动态权限