当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发工程中集成mob短信验证码功能的方法

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

北京建站,我爱问连岳,黑鳍的赃物

一.前言

现在的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软件编程有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网