热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

这篇文章主要介绍了Android获取和读取短信验证码的实现方法,文章内容介绍了如何读取刚收到的短信的相关内容,以及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.添加相关的权限

 
 
 
 
 
 
 
 
 

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

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循环,那么将会读取短信中的所有内容.这并不是我们想要的.

 当我们获取到了短信的具体内容之后,我们可以通过使用正则表达式,去匹配短信内容的数字,然后就能够获取到验证码数据了.大体的思路就是这样一个情况.同时我们需要添加相关用户权限.

 
 

完成了上面的步骤之后,我们需要获取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软件编程有所帮助。


推荐阅读
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
author-avatar
XXHYM123_702
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有