Android获取和读取短信验证码的实现方法

2019-12-10 18:35:09王冬梅
正则表达式. 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。

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));
 };
}