Android开发工程中集成mob短信验证码功能的方法

一.前言

现在的app基本上都需要用到短信功能,注册时或者有消息通知时需要给用户发送一条短信,但是对于个人开发者来说,去买第三方的短信服务实在是有点奢侈,很好的是mob为我们提供了免费的短信验证码服务功能,我不是打广告,的确觉得这项服务很不错。那么下面就简单讲一下如何在自己的工程里集成mob的短信功能,其实整个流程并不复杂,只是个人觉得mob的官方文档有点小乱,官方Demo也有点小复杂,同时有一些细节地方容易被忽视,也会导致一些问题。
PS:太喜欢mob的logo了。

二.实现过程

本篇只涉及Android,如果是IOS系统,还望自己斟酌,希望本篇文章也能给您提供帮助,同时IDE是Android Studio。

1.key申请

申请地址:http://www.mob.com,在产品中心选择短信验证码SDK,然后完成相应的注册和申请工作;
进入自己的后台中心,就可以看见自己的App Key和App Secret:

整体趋势栏给我们展示了一些短信服务使用情况。未上线登记时,我们可以免费使用20条/天,如果需求量比较大,我们可以在自己的工程里集成了mob短信,然后上线登记,应该可以获得更多的免费短信条数,暂未尝试。

2.下载SDK

在SDK下载栏目选择SMS for Android,然后选择相应IDE对应的SDK即可(本篇IDE是as)

下载后大概是这样:

3.集成过程

申请到了key和secret后就是集成到自己的工程中了。mob主要提供两种接口方式:1)使用官方自带的UI;2)使用无GUI接口。

3.1.配置SDK

这已经是使用第三方接口的老规矩了。官网文档我就不贴了,着实看着不舒服,在这里只贴自己的。

首先是在工程的libs下添加jar包和.aar文件。

然后在build.gradle中添加依赖项

在AndroidManifest中添加相应权限和注册相应的activity

 <!-- mob短信 需要的权限 -->
 <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" />
<!--在application中注册activity -->
 <!-- Mob短信(如果使用无GUI的,这个activity应该可以不需要了,自己没试过,就先在这注册着吧) -->
 <activity
  android:name="com.mob.tools.MobUIShell"
  android:configChanges="keyboardHidden|orientation|screenSize"
  android:theme="@android:style/Theme.Translucent.NoTitleBar"
  android:windowSoftInputMode="stateHidden|adjustResize" >
 </activity>

3.2.调用接口发送短信

前面提到了,mob短息提供有GUI和无GUI的两种方式,无论哪种方式,都需要对SMSSDK先初始化,再调用接口。

初始化:SMSSDK.initSDK(LoginActivity.this, "App Key", "App Secret");

1)有GUI,即使用mob提供的界面

方法如下:

 registerText.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  //首先初始化SMSSDK
  SMSSDK.initSDK(LoginActivity.this, "App Key", "App Secret");
  RegisterPage registerPage = new RegisterPage();
  //回调函数
  registerPage.setRegisterCallback(new EventHandler()
  {
   public void afterEvent(int event, int result, Object data)
   {
   // 解析结果
   if (result == SMSSDK.RESULT_COMPLETE)
   {
   //提交验证码成功
   if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
   {
   }
   //提交验证码成功,此时已经验证成功了
   else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
   {
   }
   }
   }
  });
  registerPage.show(LoginActivity.this);
  }
 });

2)无GUI

这种情况一般是使用自己的activity界面,然后集成短信功能,比如一个简单的注册。

//我只提供一些关键代码,其他部分就不提供了,太多,看起来太杂
public class ActivityMessageRegister extends Activity
{
 private static final int CODE_ING = 1;   //已发送,倒计时
 private static final int CODE_REPEAT = 2;  //重新发送
 private static final int SMSDDK_HANDLER = 3;  //短信回调
 private int TIME = 60;//倒计时60s

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_message_register);
 initView();//界面初始化
 initSDK();//短信初始化
 }
 //初始化界面
 void initView()
 {
 userPhoneText = (EditText)findViewById(R.id.user_phone_input);
 userPasswordText = (EditText)findViewById(R.id.user_password_input);
 userNameText = (EditText)findViewById(R.id.user_name_input);
 registerButton = (Button)findViewById(R.id.register_button);
 registerButton.setOnClickListener(new OnClickListener());
 loginView = (TextView)findViewById(R.id.login_view);
 getCodeButton = (Button)findViewById(R.id.get_code_button);
 getCodeButton.setOnClickListener(new OnClickListener());
 codeText = (EditText)findViewById(R.id.code_view);
 //
 ...
 //
 }
 //初始化SMSSDK
 private void initSDK()
 {
 SMSSDK.initSDK(this, "App Key", "App Secret");
 eventHandler = 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;
  msg.what = SMSDDK_HANDLER;
  handler.sendMessage(msg);
  }
 };
 // 注册回调监听接口
 SMSSDK.registerEventHandler(eventHandler);
 }
 //监听函数
 private class OnClickListener implements View.OnClickListener
 {
 @Override
 public void onClick(View v) {
  userPhone = userPhoneText.getText().toString();
  switch (v.getId()) {
  case R.id.get_code_button://获取验证码
   new AlertDialog.Builder(ActivityMessageRegister.this)
    .setTitle("发送短信")
    .setMessage("我们将把验证码发送到以下号码:\n"+"+86:"+userPhone)
    .setPositiveButton("确定", new DialogInterface.OnClickListener()
    {
    @Override
    public void onClick(DialogInterface dialog, int which)
    {
     SMSSDK.getVerificationCode("86", userPhone);
     getCodeButton.setClickable(false);
     new Thread(new Runnable()
     {
     @Override
     public void run()
     {
      for (int i = 60; i > 0; i--)
      {
      handler.sendEmptyMessage(CODE_ING);
      if (i <= 0)
      {
       break;
      }
      try
      {
       Thread.sleep(1000);
      } catch (InterruptedException e)
      {
       e.printStackTrace();
      }
      }
      handler.sendEmptyMessage(CODE_REPEAT);
     }
     }).start();
    }
    })
    .create()
    .show();
   break;

  case R.id.register_button://注册
   SMSSDK.submitVerificationCode("86", userPhone, codeText.getText().toString());//对验证码进行验证->回调函数
   break;
  default:
   break;
  }
 }
 }
 Handler handler = new Handler()
 {
 public void handleMessage(Message msg)
 {
  switch (msg.what)
  {
  case CODE_ING://已发送,倒计时
   getCodeButton.setText("重新发送("+--TIME+"s)");
   break;
  case CODE_REPEAT://重新发送
   getCodeButton.setText("获取验证码");
   getCodeButton.setClickable(true);
   break;
  case SMSDDK_HANDLER:
   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(ActivityMessageRegister.this, "验证成功", Toast.LENGTH_LONG).show();
    if (check())//其他合法性的检测
    {
    UserModel user = new UserModel();
    user.setUserId(MyUUID.getUUID());  //id
    user.setUserPhone(userPhone);
    user.setUserPassword(MD5.md5(userPassword)); //md5加密
    user.setUserGender(gender);   //性别
    user.setUserName(userName);
    user.setUserBirthday("19920401");   //暂时为空
    //user.setUserIdCard(userIdCard);
    //user.setUserImage("");    //暂时为空
    //注册->服务器
    UserController.userRegister(user, handler);
    }

   }
   //已发送验证码
   else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
   {
    Toast.makeText(getApplicationContext(), "验证码已经发送",
     Toast.LENGTH_SHORT).show();
   } else
   {
    ((Throwable) data).printStackTrace();
   }
   }
   if(result==SMSSDK.RESULT_ERROR)
   {
   try {
    Throwable throwable = (Throwable) data;
    throwable.printStackTrace();
    JSONObject object = new JSONObject(throwable.getMessage());
    String des = object.optString("detail");//错误描述
    int status = object.optInt("status");//错误代码
    if (status > 0 && !TextUtils.isEmpty(des)) {
    Toast.makeText(getApplicationContext(), des, Toast.LENGTH_SHORT).show();
    return;
    }
   } catch (Exception e) {
    //do something
   }
   }
   break;
  case R.id.register_status:
   String result_code = msg.getData().getString("result").toString();
   if("1".equals(result_code))
   {
   Toast.makeText(ActivityMessageRegister.this, "注册成功", Toast.LENGTH_LONG).show();
   Intent intent = new Intent(ActivityMessageRegister.this,LoginActivity.class);
   intent.putExtra("userPhone", userPhone);
   ActivityMessageRegister.this.setResult(RESULE_CODE, intent);
   //startActivity(intent);
   finish();
   }else
   {
   Toast.makeText(ActivityMessageRegister.this, "注册失败", Toast.LENGTH_LONG).show();
   }
   break;
  case R.id.check_phone_exist://手机号是否已存在
   String result_code_2 = msg.getData().getString("result").toString();
   if("1".equals(result_code_2))
   {
   errPhoneText.setText("手机号码已经注册,请换用其他号码");
   resultMap.put("phone", false);
   }
   else
   {
   errPhoneText.setText("");
   resultMap.put("phone", true);
   }
   break;
  }
 }
 };
}

OK,基本就大功告成。

三.问题

集成中可能会出现几个问题:

1.无法接收短信验证码

mob默认是开启了智能验证的,也意味着如果一个号码通过了一次验证码验证,那之后再次进行短信验证时,就会智能验证通过,而此时是不会接收到验证码的,因为mob不会下发验证码。这就对我们的测试造成了一定的影响,有时候,我们始终无法接收到验证码,原因就在这里。进入后台,将智能验证功能关闭就可以了。后台中心->短信设置->智能验证
这里写图片描述

2.短信验证成功后,并未执行相应的代码,而是返回到了某一个界面

还是有可能是因为智能验证的原因。

eventHandler = new EventHandler() {
  @Override
  public void afterEvent(int event, int result, Object data)
  {
  if (result == SMSSDK.RESULT_COMPLETE)
  {
   if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
   {
   //官方文档中说了,如果是智能验证只需要在这里对data进行判断就可以了
   if((Boolean)data)//是智能验证
   {
    //如果增加了这条if语句,那么就算关闭了智能验证,此时的data强制转换成了Boolean也是为true的,所以并不会执行后面的相应代码,所以,如果在集成的时候不需要智能验证,最好的方式就是不去管这个功能。
   }
   else
   {
    //非智能
   }
   }
  }
  }

所以,最妥的方式,就是彻底舍弃掉智能验证功能。

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。

时间: 2016-05-23

Android如何通过手机获取验证码来完成注册功能

注册很多app或者网络账户的时候,经常需要手机获取验证码,来完成注册,那时年少,只是觉得手机获取验证码这件事儿很好玩,并没有关心太多,她是如何实现的,以及她背后的故事到底是什么样子的,现在小编接手的这个项目里面,就需要通过手机号进行注册,并且手机号发送相应的验证码,来完成注册,那么在一些应用app里面到底是如何实现点击按钮获取验证码,来完成注册这整个流程的呢?今天小编就以注册为例,和小伙伴们分享一下,如何通过手机号获取验证码来完成注册的一整套流程以及如何采用正则表达式来验证手机号码是否符合电信.

android输入框与文本框加滚动条scrollview示例

我们都知道EditText与TextView是Android的文本输入框和文本显示框,但是基于手机屏幕的大小因素,如果在需要输入较多文字或者显示较多内容的时候,手机屏幕是远远不够的,因此让文本框具有滚动条的功能是手机上必备的,要加上滚动条,其实很简单,只需要在文本输入框或者文本显示框上面加上滚动条控件即可,该控件名字为ScrollView,以下我们对比下(以TextView举例). 复制代码 代码如下: //A.未加滚动效果 <TextView android:layout_width="

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

现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注册.简单的介绍一下吧. Android获取短信验证码还是比较简单的,通过Mob官网提供的ShareSDK,调用其中内部的方法,就可以获取到短信的验证码了.提供一下Mob的官网地址.http://www.mob.com/#/在官网上注册相关的信息之后,下载相关的jar包和.so文件就可以实现获取短信验证码了(2.0之前的版本都需要下载jar包和 .so文件,而现在的2.2

Android软键盘挡住输入框的终极解决方案

前言 开发做得久了,总免不了会遇到各种坑. 而在Android开发的路上,『软键盘挡住了输入框』这个坑,可谓是一个旷日持久的巨坑--来来来,我们慢慢看. 入门篇 最基本的情况,如图所示:在页面底部有一个EditText,如果不做任何处理,那么在软键盘弹出的时候,就有可能会挡住EditText. 对于这种情况的处理其实很简单,只需要在AndroidManifest文件中对activity设置:android:windowSoftInputMode的值adjustPan或者adjustResize即

Android文本输入框(EditText)输入密码时显示与隐藏

代码很简单,这里就不多废话了. 复制代码 代码如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android.text.Selection; import android.text.Spannable; import android.text.method.HideReturnsTransformationMethod; import android.text.method.Passw

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

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

Android输入法弹出时覆盖输入框问题的解决方法

当一个activity中含有输入框时,我们点击输入框,会弹出输入法界面,整个界面的变化效果与manifest中对应设置的android:windowSoftInputMode属性有关,一般可以设置的值如下, <activity android:windowSoftInputMode=[ "stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden&q

Android实现动态显示或隐藏密码输入框的内容

本文实例展示了Android实现动态显示或隐藏密码输入框内容的方法,分享给大家供大家参考之用.具体方法如下: 该功能可通过设置EditText的setTransformationMethod()方法来实现隐藏密码或者显示密码. 示例代码如下: private Button mBtnPassword; private EditText mEtPassword; private boolean mbDisplayFlg = false; /** Called when the activity is

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

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

Android实现常见的验证码输入框实例代码

前言 验证码输入框是很多APP必不可少的组件,之前在重构注册登录页面的时候,重新设计了UI,所以不能再简单的用EditText来做了,所以这篇文章将分享一下如何实现一个常见的验证码输入框.下面话不多说了,来一起看看详细的介绍吧. 正文 先搂一眼效果吧 不要把注意力都放在头顶的那一抹绿上,重点在输入框,可能大多数APP里都是采用6个方框的UI效果,我这里是按照我们设计的要求,用6根横线来划出6个数字的位置.一开始我想的是直接用6个TextView,然后传递焦点的做法,但是发现实现起来有一定的难度.

Android仿滴滴出行验证码输入框功能实例代码

最近公司项目中有一个类似滴滴出行填写验证码的弹框,下面是我撸出来的效果: 中间的那个输入密码的6个框框其实就是用shape画的背景,通过监听EditText获取焦点来改变背景,废话少说,直接上代码吧. 2.效果实现 代码内容比较简单,所以大家可以直接看代码 VerificationCodeInput.java /** * @author hydCoder * @date 2017/9/22 14:39 * @desc 输入验证码的自定义view * @email hyd_coder@163.co

Android绘制验证码的实例代码

在前面仿华为加载动画.仿网易音乐听歌识曲-麦克风动画中,我们通过绘图的基础知识完成了简单的绘制.在本例中,我们将绘制常见的验证码. 一.效果图 二.知识点与思路分析 通过上面的效果图观察,我们可以看到里面有绘制的随机线条,随机绘制的验证码. 绘制线条,直线或曲线 绘制文本,生成的验证码文本的绘制 绘制圆点. 三.代码编写 /** * Created by Iflytek_dsw on 2017/7/3. */ public class IdentifyCodeUtil { private sta

Android栗子の图片验证码生成实例代码

废话不多说了,下面一段代码给大家分享android 生成栗子图片验证码功能,具体代码如下所示: import java.util.Random; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; public class

Java生成验证码功能实例代码

页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_test.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import ja

Android常用正则表达式验证工具类(实例代码)

东西不多,但一般项目够用了. public class RegularUtil { //身份证 public static final String REGEX_ID_CARD = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$"; //验证邮箱 public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\

AngularJS 实现点击按钮获取验证码功能实例代码

html :样式采用了sui框架的样式,请自行引入查看,AngularJS,自己引入, <div ng-controller="forGetPassword" ng-app="routingDemoApp"> <form novalidate name="forget"> <header class="bar bar-nav"> <a href="javascript:his

Android实现图片轮播切换实例代码

利用Android的ViewFlipper和AnimationUtils实现图片带有动画的轮播切换,其中当点击"上一张"图片时,切换到上一张图片:当点击"下一张"图片时,切换到下一张图片.其效果图如下: 设置布局文件,其内容如下: activity_image_flipper_shade.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xm

Android 百度地图POI搜索功能实例代码

在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

Web制作验证码功能实例代码

web开发中,经常会使用验证码功能,例如登录.注册,或其他关键功能之前经常会使用.合理使用 验证功能可以防止ddos攻击.爬虫攻击等.   实现效果:   实现原理: 由后台提供生成验证码的接口,前端每次请求会后端会生成验证码图片和验证码,验证码图片发送到客户端供客户端显示, 验证码字符串保存再后端的Session中,待前端再次请求业务接口与session里的验证码字符串做比对.    实现思路: 1.先由后端提供可以生产验证码图片的接口 2.前端通过 img 中设置 src 属性,请求验证码生