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

?
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界面,然后集成短信功能,比如一个简单的注册。

?
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
//我只提供一些关键代码,其他部分就不提供了,太多,看起来太杂
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.短信验证成功后,并未执行相应的代码,而是返回到了某一个界面

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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软件编程有所帮助。

如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值