现在用短信验证码来实现登录和注册功能已经越来越常见了。如果你想用户在收到短信验证码后,不需要再手动输入进去的话,而是自动填入,那么你就需要做些特殊处理了!
1.监听短信变化
首先需要的是通过ContentObserver类中的OnChange()监听你的短信变化。简单的介绍下ContentObserver:内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理。
2.获取验证码
检测到了短信变化后,读取该条短信的内容,并且通过正则表达式来获取内容中的验证码。
3.修改UI
ContentObserver构造方法中有一个handler,通过handler来修改主线程中ui内容,将接收到的验证码呈现在ui上。
贴上代码,代码中有注释讲解:
MainActivity.java
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView mSmsTV;
private SmsObserver mSmsObserver;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == 1) {
String code = (String) msg.obj;
mSmsTV.setText(code);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSmsTV = (TextView) findViewById(R.id.tv_sms);
mSmsObserver = new SmsObserver(this, mHandler);
Uri smsUri = Uri.parse("content://sms");
getContentResolver().registerContentObserver(smsUri, true, mSmsObserver);//注册短信uri的监听
}
@Override
protected void onPause() {
super.onPause();
getContentResolver().unregisterContentObserver(mSmsObserver);//取消监听
}
}
SmsObserver.java
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SmsObserver extends ContentObserver {
private Context mContext;
private Handler mHandler;//更新ui
public SmsObserver(Context context, Handler handler) {
super(handler);
mContext = context;
mHandler = handler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
/* 收到一条短信,onChange()会执行两次,uri不同 */
if (uri.toString().equals("content://sms/raw")) {//未写入数据库,不进行任何操作
return;
} else {//此时已经写入数据库
Uri inboxUri = Uri.parse("content://sms/inbox");
/* 按照日期倒序排序 */
Cursor cursor = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc");
if (cursor != null) {
if (cursor.moveToFirst()) {//游标移动到first位置
/* 发件人的号码 */
String address = cursor.getString(cursor.getColumnIndex("address"));
/* 短信内容 */
String body = cursor.getString(cursor.getColumnIndex("body"));
Log.i("wyk", "address:" + address + ",body:" + body);
/* 利用正则提取验证码(根据实际情况修改) */
Pattern pattern = Pattern.compile("(\\d{6})");//提取六位数字
Matcher matcher = pattern.matcher(body);//进行匹配
if(matcher.find()){//匹配成功
String code = matcher.group(0);
Message msg = mHandler.obtainMessage(1, code);
mHandler.sendMessage(msg);
Log.i("wyk","code:"+code);
}
}
cursor.close();
}
}
}
}
最后别忘了再manifest中加入读取短信的权限
<uses-permission android:name="android.permission.READ_SMS"/>