现在很多app已经有了自动截取短信验证码的功能,更好的可以给用户好的体验感,以下我们就进行一点下短信的自动截取。
首先应该进行一下几点:
1、首先创建一个类继承自ContentObserver,类实现onChange()的方法。(onchange方法是在观察的Uri发生改变时触发)
2、在activity中注册一个内容观察者
3、在onDestroy方法中进行注销内容观察者
一、下面是继承自ContentObserver中的代码
package com.example.smscode;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by wangchaoon 17/1/21.
*/
public class SmsContentObserver extends ContentObserver {
private final Handler handler;
private final Context context;
//传一个context,和handler与activity进行交互
public SmsContentObserver(Handler handler, Context context) {
super(handler);
this.context = context;
this.handler = handler;
}
/**
* 当想要观察的对应的uri发生改变的时候,触发
*
* @param selfChange
*/
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
//查询出最新的短信
Uri smsUri = Uri.parse("content://sms/inbox");
//查询数据库
Cursor cursor = context.getContentResolver().query(smsUri, null, null, null, "date desc");
StringBuilder stringBuilder = new StringBuilder();
if (cursor.moveToNext()) {
// String address = cursor.getString(cursor.getColumnIndex("address"));
String body = cursor.getString(cursor.getColumnIndex("body"));
stringBuilder.append(body);
}
Pattern pattern = Pattern.compile("(\\d{6})");//正则表达式,来截取连续的6位数字
Matcher matcher = pattern.matcher(stringBuilder.toString());
if (matcher.find()) {
String code = matcher.group(0);
//将截取下来的数字通过handler发送给activity
handler.obtainMessage(0, code).sendToTarget();
}
}
}
二、Activity中进行注册和接受handler发送的消息
package com.example.smscode;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String message = (String) msg.obj;
tv.setText(message);
}
};
private TextView tv;
private SmsContentObserver smsContentObserver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
//观察短信
Uri uri = Uri.parse("content://sms");
smsContentObserver = new SmsContentObserver(handler, this);
//注册一个内容观察者
getContentResolver().registerContentObserver(uri, true,smsContentObserver );
}
@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(smsContentObserver);
}
}
通过以上的代码就可以简单的实现短信验证码的自动截取,理解了核心就可以把这段代码用到自己的项目需求中了。