原文著作权地址:http://www.jb51.net/article/84946.htm

demo地址:http://git.oschina.net/lizhanqi/MobSMSDemo

一.前言

现在的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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 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提供的界面

方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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界面,然后集成短信功能,比如一个简单的注册。

逻辑

package com.qg.lizhanqi.mobsms;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
public class SignUpActivity extends AppCompatActivity implements View.OnClickListener {
private TimerTask tt;
private Timer tm;
private EditText et_phonenum;
private Button btn_check;
private EditText et_checkecode;
private Button btn_sure;
private int TIME = 60;//倒计时60s这里应该多设置些因为mob后台需要60s,我们前端会有差异的建议设置90,100或者120
public String country="86";//这是中国区号,如果需要其他国家列表,可以使用getSupportedCountries();获得国家区号
private String phone;
private static final int CODE_REPEAT = 1; //重新发送
Handler hd = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == CODE_REPEAT) {
btn_check.setEnabled(true);
btn_sure.setEnabled(true);
tm.cancel();//取消任务
tt.cancel();//取消任务
TIME = 60;//时间重置
btn_check.setText("重新发送验证码");
}else {
btn_check.setText(TIME + "重新发送验证码");
}
}
};
//回调
EventHandler eh=new EventHandler(){
@Override
public void afterEvent(int event, int result, Object data) {
if (result == SMSSDK.RESULT_COMPLETE) {
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
toast("验证成功");
}else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){ //获取验证码成功
toast("获取验证码成功");
}else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){//如果你调用了获取国家区号类表会在这里回调
//返回支持发送验证码的国家列表
}
}else{//错误等在这里(包括验证失败)
//错误码请参照http://wiki.mob.com/android-api-错误码参考/这里我就不再继续写了
((Throwable)data).printStackTrace();
String str = data.toString();
toast(str);
}
}
};
//吐司的一个小方法
private void toast(final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SignUpActivity.this, str, Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
//配置app你的 SMSSDK.initSDK(this, "您的appkey", "您的appsecret");
SMSSDK.initSDK(this, "185afd2d1b380", "fa6c235598dc50b9b7881680b84109a8");
SMSSDK.registerEventHandler(eh); //注册短信回调(记得销毁,避免泄露内存)
initView(); }
private void initView() {
et_phonenum = (EditText) findViewById(R.id.et_phonenum);
btn_check = (Button) findViewById(R.id.btn_check);
et_checkecode = (EditText) findViewById(R.id.et_checkecode);
btn_sure = (Button) findViewById(R.id.btn_sure);
btn_check.setOnClickListener(this);
btn_sure.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_check:
phone = et_phonenum.getText().toString().trim().replaceAll("/s","");
if (!TextUtils.isEmpty(phone)) {
//定义需要匹配的正则表达式的规则
String REGEX_MOBILE_SIMPLE = "[1][358]\\d{9}";
//把正则表达式的规则编译成模板
Pattern pattern = Pattern.compile(REGEX_MOBILE_SIMPLE);
//把需要匹配的字符给模板匹配,获得匹配器
Matcher matcher = pattern.matcher(phone);
// 通过匹配器查找是否有该字符,不可重复调用重复调用matcher.find()
if (matcher.find()) {//匹配手机号是否存在
alterWarning();
} else {
toast("手机号格式错误");
}
} else {
toast("请先输入手机号");
}
break;
case R.id.btn_sure:
//获得用户输入的验证码
String code = et_checkecode.getText().toString().replaceAll("/s","");
if (!TextUtils.isEmpty(code)) {//判断验证码是否为空
//验证
SMSSDK.submitVerificationCode( country, phone, code);
}else{//如果用户输入的内容为空,提醒用户
toast("请输入验证码后再提交");
}
break;
}
}
//弹窗确认下发
private void alterWarning() {
// 2. 通过sdk发送短信验证
AlertDialog.Builder builder = new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("提示"); //设置标题
builder.setMessage("我们将要发送到" + phone + "验证"); //设置内容
builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
//设置确定按钮
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss(); //关闭dialog
// 2. 通过sdk发送短信验证(请求获取短信验证码,在监听(eh)中返回)
SMSSDK.getVerificationCode(country, phone);
//做倒计时操作
Toast.makeText(SignUpActivity.this, "已发送" + which, Toast.LENGTH_SHORT).show();
btn_check.setEnabled(false);
btn_sure.setEnabled(true);
tm = new Timer();
tt = new TimerTask() {
@Override
public void run() {
hd.sendEmptyMessage(TIME--);
}
};
tm.schedule(tt,0,1000);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { //设置取消按钮
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Toast.makeText(SignUpActivity.this, "已取消" + which, Toast.LENGTH_SHORT).show();
}
});
//参数都设置完成了,创建并显示出来
builder.create().show();
}
//销毁短信注册
@Override
protected void onDestroy() {
super.onDestroy();
// 注销回调接口registerEventHandler必须和unregisterEventHandler配套使用,否则可能造成内存泄漏。
SMSSDK.unregisterEventHandler(eh); }
}

----------------------------------华丽的 分割线---------------------------------------------------------------------

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="50dp"
android:gravity="center"
tools:context="com.qg.lizhanqi.mobsms.SignUpActivity"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:inputType="phone"
android:id="@+id/et_phonenum"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="手机号码" />
<Button
android:id="@+id/btn_check"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送验证码" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"> <EditText
android:id="@+id/et_checkecode"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="验证码" /> <Button
android:enabled="false"
android:id="@+id/btn_sure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="验证" />
</LinearLayout>
</LinearLayout>
 

Mob短信验证的具体使用的更多相关文章

  1. Mob短信验证的配置的解释

    原文地址:http://www.jb51.net/article/84946.htm 关于mob短信验证的解释: mob官方是这样写的: repositories{ flatDir{ dirs 'li ...

  2. 『实践』Android之短信验证码(用的Mob短信验证)

    1.参考资料 Mob网站:http://www.mob.com/ Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android 教程:htt ...

  3. MOB 短信验证

    工具/原料   Android Studio mob SDK中的jar 和.so文件 方法/步骤   1 把3个jar 放入libs   并添加依赖 在项目的build.gradle里面   在你的项 ...

  4. Mob.com 短信验证的简单使用

    1.环境配置 http://wiki.sharesdk.cn/android-短信sdk集成文档/ a.sdk下载 http://www.mob.com/#/downloadDetail/SMS/an ...

  5. 【mob】Android短信验证+源码

    在很多的应用当中,都涉及到了短信验证的功能,比如在注册或者找回密码的时候,那么我们如何通过第三方的平台来完成这个功能呢? 本面博文就实现短信验证,来做一个小的栗子. 第一步-下载开发包 第二步-将SD ...

  6. Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自己主动填入功能结合实例)

    用户注冊或者找回password时通常会用到短信验证功能.这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注冊用户.获取SD ...

  7. Mob 之 短信验证集成 SMSSDK

    开相关发中总会遇到短信验证这些操作,这周没有来得及写新的东西,借此分享一篇以前学习短信验证的笔记,本文使用的是 Mob 提供的 SMSSDK . 下载 SMSSDK 官网下载地址:SMSSDK 集成 ...

  8. 完整的Android手机短信验证源码

    短信验证功能我分两个模块来说,短信验证码的后台和代码实现短信验证码的功能. 一.短信验证码的后台      1.注册Mob账号:http://www.mob.com/#/login 2.注册成功之后, ...

  9. android短信验证

    短信验证demo http://download.csdn.net/detail/crazy1235/8315279#comment 使用MOB平台开发,用法详见: http://blog.csdn. ...

随机推荐

  1. Qt串口通信

    1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...

  2. Oracle decode函数 除数为零

    decode (expression, search_1, result_1)如果 expression结果=search_1结果,则返回result_1,类似 if elsedecode (expr ...

  3. silverlight 生成图表 WCF 解析XML代码.svc.cs 文件

    silverlight 调用wcf 文件代码 private ListItem AnalyzeXML(string XMLCode, string Reportdate, string ChartNa ...

  4. mercurial(Hg) Server 搭建 过程记录

    mercurial(Hg) Server 搭建 过程记录 1.  环境说明 只是测试搭建,环境为本机开发环境:win 8.1 + IIS8.5 软件准备: 2.  软件安装 先安装Python2.7, ...

  5. HSSFClientAnchor(int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2, int row2)

      public HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int  ...

  6. sqlite数据库操作详细介绍 增删改查,游标

    sqlite数据库操作详细介绍 增删改查,游标     本文来源于www.ifyao.com禁止转载!www.ifyao.com Source code     package com.example ...

  7. select p.id, name,ROW_NUMBER() over(PARTITION by name order by p.id) names from person p

    select p.id, name,ROW_NUMBER() over(PARTITION  by name order by p.id) names from person p

  8. grep详解

    一.简介 Global Regular Expression Print,是一种强大的文本搜索工具,能使用正则表达式. 二.语法 grep [OPTIONS] PATTERN [FILE...]gre ...

  9. Game of Life 解答

    Question According to the Wikipedia's article: "The Game of Life, also known simply as Life, is ...

  10. Spark机器学习笔记一

    Spark机器学习库现支持两种接口的API:RDD-based和DataFrame-based,Spark官方网站上说,RDD-based APIs在2.0后进入维护模式,主要的机器学习API是spa ...