标签:
原文著作权地址:http://www.jb51.net/article/84946.htm
一.前言
现在的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 ; } } }; } |
标签:
原文地址:http://www.cnblogs.com/lizhanqi/p/5720962.html