本案例超级简单,不深挖内部具体实现,只简单说下怎么使用,本猿菜鸟水平,代码也是网上扒的,但是针对6.0需要加几个权限,大神请路过~废话不多说直接上手,本文最后附源码链接。
先看看效果吧:
第一步:添加权限:
<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群)