

最后注册完的样式就是这样的..我们来看看具体实现..
1.如何获取短信验证码.
i.首先需要初始化SDK,第三方这些东西首先必须要有的操作就是初始化SDK.一般都在OnCreate()函数中来完成.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); SMSSDK.initSDK(this, AppKey, APPSECRET); EventHandler eh = new EventHandler() {@Overridepublic 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); } 这个是必须要进行的操作,否则后续的东西都将无法完成.initSDK(Context context,String AppKey,String AppSECRET),初始化需要传递Context对象,以及我们申请的Key和SECRET.并且这里定义了一个EventHandler,用来进行验证的时候将一些消息提供给主线程的Handler,让主线程来做一些相关的操作来通知用户验证的情况到底如何./** * @param string 电话号码的区号 比如说86 * @param string 具体的电话号码 */SMSSDK.getVerificationCode("86", PhoneEd.getText().toString());我们在调用方法的时候,需要传递我们手机号码的区号和具体的手机号码.由于中国国内是86开头.因此传递的区号就是86,在加上自己的电话号码就可以通过网络调用方法来获取相关的验证码了.
<uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />那么如何获取短信的相关内容呢?
private class SmsObserver extends ContentObserver {public SmsObserver(Handler handler) { super(handler); // TODO Auto-generated constructor stub}/** *Uri.parse("content://sms/inbox")表示对收到的短信的一个监听的uri. */@Overridepublic 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);//这里不要使用while循环.我们只需要获取当前发送过来的短信数据就可以了. cursor.moveToNext(); sb.append("body=" + cursor.getString(cursor.getColumnIndex("body"))); //获取短信内容的实体数据. Pattern pattern = Pattern.compile("[^0-9]"); //正则表达式. Matcher matcher = pattern.matcher(sb.toString()); CodeText = matcher.replaceAll(""); CodeEd.setText(CodeText); //将输入验证码的控件内容进行改变. cursor.close(); //关闭游标指针. super.onChange(selfChange);} } 实现类的方式如上,通过重写OnChange方法来进行后续的操作,这里的cursor可以对当前的短信数据库中的数据进行查找,这里的cursor指针不要使用while循环,因为验证码这条短信是随发即用的,我们也只需要获取当前发送过来的验证码短信中的相关内容,如果cursor使用了while循环,那么将会读取短信中的所有内容.这并不是我们想要的.<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />完成了上面的步骤之后,我们需要获取ContentResolver实例,然后注册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() {@Overridepublic 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}@Overridepublic 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 stubswitch (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)); };}这样就能够完成一个简单的通过使用短信验证码的方式来实现验证,在一般的项目中,我们可以根据具体的需求进行相关的改良,总之万变不离其宗思路基本都是一样的.当然在判断是否有短信到来也可以使用BroadCaseReceiver来实现,不过我看了网上的一些相关的资源,自己也试了一下,没有实现出来.感觉没有ContentObserver这么简单方便.