实现类的方式如上,通过重写OnChange方法来进行后续的操作,这里的cursor可以对当前的短信数据库中的数据进行查找,这里的cursor指针不要使用while循环,因为验证码这条短信是随发即用的,我们也只需要获取当前发送过来的验证码短信中的相关内容,如果cursor使用了while循环,那么将会读取短信中的所有内容.这并不是我们想要的.
当我们获取到了短信的具体内容之后,我们可以通过使用正则表达式,去匹配短信内容的数字,然后就能够获取到验证码数据了.大体的思路就是这样一个情况.同时我们需要添加相关用户权限.
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />
完成了上面的步骤之后,我们需要获取ContentResolver实例,然后注册ContentObserver。
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new SmsObserver(new Handler()));
注册我们需要传递相关的uri,第二个参数决定匹配uri的方式,如果设置为true的话,那么表示不精确匹配,那么也就表示,如果是一类的uri,那么都会被匹配到,如果设置为false,那么也就只能匹配到我们传递进去的uri,也就是所谓的精确匹配.最后一个对象需要传递一个子类的实例,并且需要传递Handler对象.这样我们也就可以在这个方法里去更新ui了.
当我们不需要使用ContentObserver的时候,我们只需要注销注册就可以了.
相对而言,验证码信息一般都是内容比较少的,如果内容比较复杂,然后还有其他额外的数字信息,那么我们在使用正则表达式的时候同时需要进行相关的优化.
最后上一个源代码:
package com.example.sms;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONObject;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import cn.smssdk.utils.SMSLog;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private Button getCode;
private Button Identity;
private EditText PhoneEd;
private EditText CodeEd;
private String AppKey = "110ee66f30b40";
private String APPSECRET = "85ec67aed1b89e3ec73f37b8b89f5142";
public String phone;
private String CodeText;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int event = msg.arg1;
int result = msg.arg2;
Object data = msg.obj;
if (result == SMSSDK.RESULT_COMPLETE) {
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
Toast.makeText(getApplicationContext(), "提交验证码成功",
Toast.LENGTH_SHORT).show();
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 已经验证
Toast.makeText(getApplicationContext(), "验证码已经发送",
Toast.LENGTH_SHORT).show();
}
} else {
int status = 0;
try {
((Throwable) data).printStackTrace();
Throwable throwable = (Throwable) data;
JSONObject object = new JSONObject(throwable.getMessage());
String des = object.optString("detail");
status = object.optInt("status");
if (!TextUtils.isEmpty(des)) {
Toast.makeText(MainActivity.this, des,
Toast.LENGTH_SHORT).show();
return;
}
} catch (Exception e) {
SMSLog.getInstance().w(e);
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
SMSSDK.initSDK(this, AppKey, APPSECRET);
EventHandler eh = new EventHandler() {
@Override
public void afterEvent(int event, int result, Object data) {
Message msg = new Message();
msg.arg1 = event;
msg.arg2 = result;
msg.obj = data;
handler.sendMessage(msg);
}
};
SMSSDK.registerEventHandler(eh);
}
private void init() {
getCode = (Button) findViewById(R.id.getCode);
Identity = (Button) findViewById(R.id.Indentity);
PhoneEd = (EditText) findViewById(R.id.PhoneEd);
CodeEd = (EditText) findViewById(R.id.Code);
getCode.setOnClickListener(this);
Identity.setOnClickListener(this);
}
private class SmsObserver extends ContentObserver {
public SmsObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
Cursor cursor = getContentResolver().query(
Uri.parse("content://sms/inbox"), null, null, null, null);
cursor.moveToNext();
sb.append("body=" + cursor.getString(cursor.getColumnIndex("body")));
System.out.println(sb.toString());
Pattern pattern = Pattern.compile("[^0-9]");
Matcher matcher = pattern.matcher(sb.toString());
CodeText = matcher.replaceAll("");
CodeEd.setText(CodeText);
cursor.close();
super.onChange(selfChange);
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.getCode: // 获取验证码的过程.
if (!TextUtils.isEmpty(PhoneEd.getText().toString())) {
getContentResolver().registerContentObserver(
Uri.parse("content://sms"), true,
new SmsObserver(new Handler()));
SMSSDK.getVerificationCode("86", PhoneEd.getText().toString());
phone = PhoneEd.getText().toString();
} else {
Toast.makeText(MainActivity.this, "电话号码不能为空", Toast.LENGTH_LONG)
.show();
}
break;
case R.id.Indentity:
SMSSDK.submitVerificationCode("86", phone, CodeEd.getText()
.toString());
break;
}
}
protected void onDestroy() {
SMSSDK.unregisterAllEventHandler();
getContentResolver().unregisterContentObserver(new SmsObserver(handler));
};
}










