Android开发之自动填写短信验证码
在Android的日常开发中,少不了编写带有注册和登录功能的App,而且现在大部分的注册信息都需要短信验证码,那我们如何实现自动填写短信验证码功能呢,莫要捉急,经本人研究,现已实现,现将代码贴出,望各位大神批评指正,不喜勿喷,谢谢O(∩_∩)O谢谢!
其实呢,想要实现这个功能很简单,我们只需要定义一个内容观察者,让其帮我们短信的状态,千万要记得加权限哦!
下面我们废话少说,直接上代码了:
核心代码:
MainActivity:
package apps.flying.testfillverificationcodeautomatically;
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.TextView;
import apps.flying.testfillverificationcodeautomatically.observer.SMSObserver;
public class MainActivity extends ActionBarActivity {
public static final int GETCODESUCCCESSFUL = 1;
private TextView tv;
private ContentResolver resolver;
private SMSObserver smsObserver;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int what = msg.what;
if (what == GETCODESUCCCESSFUL) {
String code = (String) msg.obj;
tv.setText(code);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
tv = (TextView) findViewById(R.id.tv);
}
private void initData() {
smsObserver = new SMSObserver(MainActivity.this, mHandler);
Uri uri = Uri.parse("content://sms");
resolver = getContentResolver();
resolver.registerContentObserver(uri, true, smsObserver);
}
@Override
protected void onPause() {
super.onPause();
resolver.unregisterContentObserver(smsObserver);
}
}
import android.content.ContentResolver;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.TextView;
import apps.flying.testfillverificationcodeautomatically.observer.SMSObserver;
public class MainActivity extends ActionBarActivity {
public static final int GETCODESUCCCESSFUL = 1;
private TextView tv;
private ContentResolver resolver;
private SMSObserver smsObserver;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int what = msg.what;
if (what == GETCODESUCCCESSFUL) {
String code = (String) msg.obj;
tv.setText(code);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
tv = (TextView) findViewById(R.id.tv);
}
private void initData() {
smsObserver = new SMSObserver(MainActivity.this, mHandler);
Uri uri = Uri.parse("content://sms");
resolver = getContentResolver();
resolver.registerContentObserver(uri, true, smsObserver);
}
@Override
protected void onPause() {
super.onPause();
resolver.unregisterContentObserver(smsObserver);
}
}
SMSObserver:
package apps.flying.testfillverificationcodeautomatically.observer;
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;
import apps.flying.testfillverificationcodeautomatically.MainActivity;
public class SMSObserver extends ContentObserver {
private Context mContext;
private Handler mHandler;
public SMSObserver(Context context, Handler handler) {
super(handler);
this.mContext = context;
this.mHandler = handler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
Log.d("SMSObserver", "短信内容发生变化");
if (uri.toString().equals("content://sms/raw")) {
return;
}
String code = "";
Uri mUri = Uri.parse("content://sms");
Cursor cursor = mContext.getContentResolver().query(mUri, null, null, null, "date desc");
if (cursor != null) {
if (cursor.moveToFirst()) {
String address = cursor.getString(cursor.getColumnIndex("address"));
String body = cursor.getString(cursor.getColumnIndex("body"));
Log.d("SMSObserver", "发件人为:" + address + " " + "短信内容为:" + body);
Pattern mPattern = Pattern.compile("(\\d{6})");
Matcher matcher = mPattern.matcher(body);
if (matcher.find()) {
code = matcher.group(0);
mHandler.obtainMessage(MainActivity.GETCODESUCCCESSFUL, code).sendToTarget();
}
}
cursor.close();
}
}
}
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;
import apps.flying.testfillverificationcodeautomatically.MainActivity;
public class SMSObserver extends ContentObserver {
private Context mContext;
private Handler mHandler;
public SMSObserver(Context context, Handler handler) {
super(handler);
this.mContext = context;
this.mHandler = handler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
Log.d("SMSObserver", "短信内容发生变化");
if (uri.toString().equals("content://sms/raw")) {
return;
}
String code = "";
Uri mUri = Uri.parse("content://sms");
Cursor cursor = mContext.getContentResolver().query(mUri, null, null, null, "date desc");
if (cursor != null) {
if (cursor.moveToFirst()) {
String address = cursor.getString(cursor.getColumnIndex("address"));
String body = cursor.getString(cursor.getColumnIndex("body"));
Log.d("SMSObserver", "发件人为:" + address + " " + "短信内容为:" + body);
Pattern mPattern = Pattern.compile("(\\d{6})");
Matcher matcher = mPattern.matcher(body);
if (matcher.find()) {
code = matcher.group(0);
mHandler.obtainMessage(MainActivity.GETCODESUCCCESSFUL, code).sendToTarget();
}
}
cursor.close();
}
}
}
Ok,代码已贴出,正所谓取之于社会,回报于社会,还望各位大神批评指正,不喜勿喷,灰常感谢,O(∩_∩)O哈哈~