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

现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注册.简单的介绍一下吧.

Android获取短信验证码还是比较简单的,通过Mob官网提供的ShareSDK,调用其中内部的方法,就可以获取到短信的验证码了.提供一下Mob的官网地址.http://www.mob.com/#/在官网上注册相关的信息之后,下载相关的jar包和.so文件就可以实现获取短信验证码了(2.0之前的版本都需要下载jar包和 .so文件,而现在的2.2版本已经不需要下载.so文件了,通过加载SMSSDK.jar,MobCommons.jar,MobTools.jar包就可以直接使用).如何注册我就不解释了.

最后注册完的样式就是这样的..我们来看看具体实现..

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() {

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

这个是必须要进行的操作,否则后续的东西都将无法完成.initSDK(Context context,String AppKey,String AppSECRET),初始化需要传递Context对象,以及我们申请的Key和SECRET.并且这里定义了一个EventHandler,用来进行验证的时候将一些消息提供给主线程的Handler,让主线程来做一些相关的操作来通知用户验证的情况到底如何.

ii.调用SMSSDK.getVerificationCode(String,String)方法

初始化SDK之后,我们就可以通过使用getVerificationCode()方法来获取我们的验证码了.

/**
 * @param string 电话号码的区号 比如说86
 * @param string 具体的电话号码
 */
SMSSDK.getVerificationCode("86", PhoneEd.getText().toString());

我们在调用方法的时候,需要传递我们手机号码的区号和具体的手机号码.由于中国国内是86开头.因此传递的区号就是86,在加上自己的电话号码就可以通过网络调用方法来获取相关的验证码了.

iii.验证我们输入的验证码和发送过来的验证码是一致的.

当验证码发送过来的时候,客户端一般就需要进行输入,但是这里需要一个验证的过程,判断当前用户输入的验证码和发送过来的验证码是否一致.

SMSSDK.submitVerificationCode("86", phone, CodeEd.getText().toString());
  验证的方式通过调用submitVerificationCode()方法来完成.需要传递区号,电话号码,以及我们输入的验证码的数值.验证的过程由ShareSDK帮我们完成.因此就不需要执行太多复杂的操作.当我们传递的数值和发送过来的数值是一样的,那么就会验证成功,否则就会验证失败.

这样在我们的客户端软件上就可以通过这种验证方式来完成注册功能.当验证成功后,就可以进入新的界面,如果验证失败,那么就需要确认输入的验证码.这样就能够完成应用程序的验证码验证.

一般情况下,我们只需要通过查看短信,然后提交相关的验证码就可以了,但是还有一些其他的应用更加的人性化,当验证码信息发送到手机内部的时候直接就能够获取到相关的验证码,然后直接添加在需要验证的地方,这样非常的方便,并且还能防止用户输入错误.那么这就涉及到读取短信的相关内容了.

iv.添加相关的权限

 <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" />

那么如何获取短信的相关内容呢?

2.如何获取刚收到的短信的相关内容.

一般而言,短信的验证是以新短信的方式直接发送给用户的,那么应用程序如果想到读取刚收到的短息内容,就需要有相关的监听事件.我通过使用ContentObserver来实现的.通过使用这个类可以捕捉特定的uri使数据库改变,然后进而作一些相关的处理.

那么我们就可以这样去实现,通过继承ContentObserver类,重写内部的onChange方法,设置特定的Uri,使得我们的类能够监听短信数据发生了变化这样我们的应用程序就知道什么时候短信到来了.那么短信到来之后,我们通过对短信内容的获取,然后读取内容中的验证码信息就可以了.

private class SmsObserver extends ContentObserver {

  public SmsObserver(Handler handler) {
   super(handler);
   // TODO Auto-generated constructor stub
  }
  /**
   *Uri.parse("content://sms/inbox")表示对收到的短信的一个监听的uri.
   */
  @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);
      //这里不要使用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。

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

这样就能够完成一个简单的通过使用短信验证码的方式来实现验证,在一般的项目中,我们可以根据具体的需求进行相关的改良,总之万变不离其宗思路基本都是一样的.当然在判断是否有短信到来也可以使用BroadCaseReceiver来实现,不过我看了网上的一些相关的资源,自己也试了一下,没有实现出来.感觉没有ContentObserver这么简单方便.

源码下载:Android获取和读取短信验证码

以上就是Android获取和读取短信验证码的实现方法,希望对大家学习Android软件编程有所帮助。

(0)

相关推荐

  • Android短信接收监听、自动回复短信操作例子

    定义广播接收器的Action: 复制代码 代码如下: private static final String TAG ="SmsService";/*** 信息发送状态广播*/private static final String ACTION_SMS_SEND  = "com.SmsService.send";  /*** 信息接收状态广播*/private static final String ACTION_SMS_DELIVERY = "com.S

  • Android编程实现定时发短信功能示例

    本文实例讲述了Android编程实现定时发短信功能.分享给大家供大家参考,具体如下: 第一,要实现发短信的功能,必须要用到android系统中发短信的权限,即在AndoridManifest.xml中添加如下内容 <uses-permissionandroid:name="android.permission.SEND_SMS"/> 第二,使用AlarmManager来实现一个倒计时的功能,当时间到时发送短   信.AlarmManager有两个相似的用法: 1.在指定时常

  • Android编程实现拦截短信并屏蔽系统Notification的方法

    本文实例讲述了Android编程实现拦截短信并屏蔽系统Notification的方法.分享给大家供大家参考,具体如下: 拦截短信有几个关键点: 1.android接收短信时是以广播的方式 2.程序只要在自己的Manifest.xml里加有"接收"SMS的权限 <uses-permission android:name="android.permission.RECEIVE_SMS"> </uses-permission> <uses-p

  • android中可以通过两种方式调用接口发送短信

    第一:调用系统短信接口直接发送短信:主要代码如下: 复制代码 代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getDefault(); List<String> divideContents = smsManager.divideMessage(content); for (String text : divideContents) { smsManager.sendTextMessage("150xxxxxxxx&qu

  • android读取短信示例分享

    复制代码 代码如下: package com.homer.sms; import java.sql.Date;import java.text.SimpleDateFormat; import android.app.Activity;import android.database.Cursor;import android.database.sqlite.SQLiteException;import android.net.Uri;import android.os.Bundle;import

  • Android实现发送短信功能实例详解

    本文实例分析了Android实现发送短信功能的方法.分享给大家供大家参考,具体如下: 短信和打电话一样,都是android手机的基本功能,下面以实例说明android如何实现发送短信的功能. 程序如下所示: import java.util.regex.Matcher; import java.util.regex.Pattern; import android.app.Activity; import android.app.PendingIntent; import android.cont

  • Android实现获取未接来电和未读短信数量的方法

    本文实例展示了Android实现获取未接来电和未读短信数量的方法,在Android程序开发中非常常见,是非常实用的功能,现分享给大家供大家参考.具体如下: 一.未读短信   首先注册Observer,当有新短信或彩信来的时候会调用 onChange方法,我们可以在onChange方法中去获取未读短信和彩信,然后做一些UI上的处理! 具体功能代码如下: private ContentObserver newMmsContentObserver = new ContentObserver(new H

  • Android实现短信验证码自动填写功能

    本实例为大家分享了Android实现短信验证码自动填写功能,供大家参考,具体内容如下 实现思路很简单: 1.在需要输入验证码的Activity代码注册监听短信的广播 2.拦截短信,获取其中的验证码 3.回写到EditText private SmsReciver smsReciver = new SmsReciver(); /** 收到短信Action **/ String ACTION_SMS_RECIVER = "android.provider.Telephony.SMS_RECEIVED

  • android短信拦截的实现代码

    短信拦截的实现主要是使用了广播接收者来实现. BroadcastReceiver  广播接收者   必须指定要接收的广播类型.必须明确的指定action 广播:事件.普通广播: 是异步的.会广播接收者同时接收,不能被中断sendBroadcast()有序广播: 是同步的.会根据广播接收的优先级进行接收,是可以中断   短信到来广播 sendOrderBroadcast()priority的范围是:-1000 ~ 1000如果有序广播明确的指定了广播接收者,他是无法被中断的. 代码实现如下: 1.

  • android短信监听工具(示例代码)

    在学习本实例之前,读者请先了解一下android四大组件中的"广播接收者"的基本概念和使用. 由于是"监听程序",所以就不需要建立Activity.这样也算是一种"遮掩"吧.使用BroadcastReceiver,就能达到这"不可告人"的目的.呵呵.当然,使用服务来开发此类应用,更加合适.这里就不再深入讨论"服务"了.本实例仅供学习参考,请勿非法用途. 复制代码 代码如下: package cn.itcas

  • Android发送短信功能代码

    本文实例讲述了Android发送短信功能代码,是进行Android程序开发中非常常见的重要功能.分享给大家供大家参考之用.具体方法如下: // 发送短信 public void sendMsg(){ String content = edtSend.getText().toString(); SmsManager smsManager = SmsManager.getDefault(); List<String> divideContents = smsManager.divideMessag

  • Android实现自动提取短信验证码功能

    本文实例讲解了Android自动提取短信验证码解决方案,分享给大家供大家参考,具体内容如下 主要功能及优点 1.收到验证码短信后,自动提取短信中的验证码填写到相应输入框 2.可指定一个号码,只读取与他有关短信,避免提取来源错误 3.利用正则表达式,可匹配各种类型验证码 模块集成关键步骤     将auto_getcode_demo中src包里的SMSContentObserver类复制到你的项目src包中 在SMSContentObserver中:    修改正则表达式内容来匹配自己想要获取的字

随机推荐