今天写一个常见的功能——手机app中注册或绑定手机号的获取验证码的功能。也就是短信验证功能

  具体效果就是,你在注册界面填写手机号,点击获取验证码按钮,---然后会收到验证短信,填入验证码后点击注册按钮,如果验证正确就可以跳转到另外一个界面

  1.首先大家需要在mob官网注册一个账号,mob是一个免费的短信验证平台

  2.在mob.com后台创建应用

  3.下载对应的sdk

  4.将sdk作为一个library导入到你的项目中

  5.现在就可以在你的项目中编写代码使用mob提供的这个功能了

  具体代码如下:

  首先配置文件加入权限:

XML/HTML代码

1. <uses-permission android:name="android.permission.READ_CONTACTS" />    
2. <uses-permission android:name="android.permission.READ_PHONE_STATE" />    
3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
4. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
5. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>    
6. <uses-permission android:name="android.permission.INTERNET" />    
7. <uses-permission android:name="android.permission.RECEIVE_SMS" />    
8. <uses-permission android:name="android.permission.GET_TASKS" />    
9. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

XML/HTML代码

1. <activity    
2. android:name="cn.smssdk.SMSSDKUIShell"    
3. android:configChanges="keyboardHidden|orientation|screenSize"    
4. android:theme="@android:style/Theme.Translucent.NoTitleBar"    
5. android:windowSoftInputMode="stateHidden|adjustResize"/>

  注册界面xml布局文件

XML/HTML代码

1. <?xml version="1.0" encoding="utf-8"?>    
2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
3. android:layout_width="match_parent"    
4. android:layout_height="match_parent"    
5. android:orientation="vertical" >    
6.     
7. <EditText    
8. android:id="@+id/login_input_phone_et"    
9. android:layout_width="280dp"    
10. android:layout_height="wrap_content"    
11. android:layout_alignParentTop="true"    
12. android:layout_centerHorizontal="true"    
13. android:layout_marginTop="107dp"    
14. android:ems="10"    
15. android:hint="请输入手机号"    
16. android:inputType="phone" />    
17.     
18. <requestFocus />    
19.     
20. <EditText    
21. android:id="@+id/login_input_code_et"    
22. android:layout_width="170dp"    
23. android:layout_height="wrap_content"    
24. android:layout_alignLeft="@+id/login_input_phone_et"    
25. android:layout_below="@+id/login_input_phone_et"    
26. android:layout_marginTop="44dp"    
27. android:hint="请输入验证码"    
28. android:inputType="textPassword" >    
29. </EditText>    
30.     
31. <Button    
32. android:id="@+id/login_request_code_btn"    
33. android:layout_width="wrap_content"    
34. android:layout_height="wrap_content"    
35. android:layout_alignRight="@+id/login_input_phone_et"    
36. android:layout_alignTop="@+id/login_input_code_et"    
37. android:text="获取验证码" />    
38.     
39. <Button    
40. android:id="@+id/login_commit_btn"    
41. android:layout_width="280dp"    
42. android:layout_height="wrap_content"    
43. android:layout_alignLeft="@+id/login_input_code_et"    
44. android:layout_below="@+id/login_input_code_et"    
45. android:layout_marginTop="44dp"    
46. android:text="注册" />    
47.     
48. </RelativeLayout>    
 
   注册界面activity
 

   Java代码

1. package com.mobdemo.view;    
2.     
3.     
4. import cn.smssdk.EventHandler;    
5. import cn.smssdk.SMSSDK;    
6. import android.app.Activity;    
7. import android.content.Intent;    
8. import android.os.Bundle;    
9. import android.os.Handler;    
10. import android.os.Message;    
11. import android.text.TextUtils;    
12. import android.util.Log;    
13. import android.view.Gravity;    
14. import android.view.View;    
15. import android.view.View.OnClickListener;    
16. import android.widget.Button;    
17. import android.widget.EditText;    
18. import android.widget.FrameLayout;    
19. import android.widget.ProgressBar;    
20. import android.widget.Toast;    
21. import android.widget.FrameLayout.LayoutParams;    
22.     
23. public class LoginActivity extends Activity implements OnClickListener {    
24. "101732155b605";    
25. "69d1850f4b74100266ab576b64e6cb16";    
26.     
27. // 手机号输入框    
28. private EditText inputPhoneEt;    
29.     
30. // 验证码输入框    
31. private EditText inputCodeEt;    
32.     
33. // 获取验证码按钮    
34. private Button requestCodeBtn;    
35.     
36. // 注册按钮    
37. private Button commitBtn;    
38.     
39. //    
40. int i = 30;    
41.     
42. @Override    
43. protected void onCreate(Bundle savedInstanceState) {    
44. super.onCreate(savedInstanceState);    
45.         setContentView(R.layout.activity_login);    
46.     
47.         init();    
48.     }    
49.     
50. /** 
51.      * 初始化控件 
52.      */    
53. private void init() {    
54.         inputPhoneEt = (EditText) findViewById(R.id.login_input_phone_et);    
55.         inputCodeEt = (EditText) findViewById(R.id.login_input_code_et);    
56.         requestCodeBtn = (Button) findViewById(R.id.login_request_code_btn);    
57.         commitBtn = (Button) findViewById(R.id.login_commit_btn);    
58. this);    
59. this);    
60.     
61. // 启动短信验证sdk    
62. this, APPKEY, APPSECRETE);    
63. new EventHandler(){    
64. @Override    
65. public void afterEvent(int event, int result, Object data) {    
66. new Message();    
67.                 msg.arg1 = event;    
68.                 msg.arg2 = result;    
69.                 msg.obj = data;    
70.                 handler.sendMessage(msg);    
71.             }    
72.         };    
73. //注册回调监听接口    
74.         SMSSDK.registerEventHandler(eventHandler);    
75.     }    
76.     
77. @Override    
78. public void onClick(View v) {    
79.         String phoneNums = inputPhoneEt.getText().toString();    
80. switch (v.getId()) {    
81. case R.id.login_request_code_btn:    
82. // 1. 通过规则判断手机号    
83. if (!judgePhoneNums(phoneNums)) {    
84. return;    
85. // 2. 通过sdk发送短信验证    
86. "86", phoneNums);    
87.     
88. // 3. 把按钮变成不可点击,并且显示倒计时(正在获取)    
89. false);    
90. "重新发送(" + i + ")");    
91. new Thread(new Runnable() {    
92. @Override    
93. public void run() {    
94. for (; i > 0; i--) {    
95. 9);    
96. if (i <= 0) {    
97. break;    
98.                         }    
99. try {    
100. 1000);    
101. catch (InterruptedException e) {    
102.                             e.printStackTrace();    
103.                         }    
104.                     }    
105. 8);    
106.                 }    
107.             }).start();    
108. break;    
109.     
110. case R.id.login_commit_btn:    
111. //将收到的验证码和手机号提交再次核对    
112. "86", phoneNums, inputCodeEt    
113.                     .getText().toString());    
114. //createProgressBar();    
115. break;    
116.         }    
117.     }    
118.     
119. /** 
120.      *  
121.      */    
122. new Handler() {    
123. public void handleMessage(Message msg) {    
124. if (msg.what == -9) {    
125. "重新发送(" + i + ")");    
126. else if (msg.what == -8) {    
127. "获取验证码");    
128. true);    
129. 30;    
130. else {    
131. int event = msg.arg1;    
132. int result = msg.arg2;    
133.                 Object data = msg.obj;    
134. "event", "event=" + event);    
135. if (result == SMSSDK.RESULT_COMPLETE) {    
136. // 短信注册成功后,返回MainActivity,然后提示    
137. if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {// 提交验证码成功    
138. "提交验证码成功",    
139.                                 Toast.LENGTH_SHORT).show();    
140. new Intent(LoginActivity.this,    
141. class);    
142.                         startActivity(intent);    
143. else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {    
144. "正在获取验证码",    
145.                                 Toast.LENGTH_SHORT).show();    
146. else {    
147.                         ((Throwable) data).printStackTrace();    
148.                     }    
149.                 }    
150.             }    
151.         }    
152.     };    
153.     
154.     
155. /** 
156.      * 判断手机号码是否合理 
157.      *  
158.      * @param phoneNums 
159.      */    
160. private boolean judgePhoneNums(String phoneNums) {    
161. if (isMatchLength(phoneNums, 11)    
162.                 && isMobileNO(phoneNums)) {    
163. return true;    
164.         }    
165. this, "手机号码输入有误!",Toast.LENGTH_SHORT).show();    
166. return false;    
167.     }    
168.     
169. /** 
170.      * 判断一个字符串的位数 
171.      * @param str 
172.      * @param length 
173.      * @return 
174.      */    
175. public static boolean isMatchLength(String str, int length) {    
176. if (str.isEmpty()) {    
177. return false;    
178. else {    
179. return str.length() == length ? true : false;    
180.         }    
181.     }    
182.     
183. /** 
184.      * 验证手机格式 
185.      */    
186. public static boolean isMobileNO(String mobileNums) {    
187. /* 
188.          * 移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188 
189.          * 联通:130、131、132、152、155、156、185、186 电信:133、153、180、189、(1349卫通) 
190.          * 总结起来就是第一位必定为1,第二位必定为3或5或8,其他位置的可以为0-9 
191.          */    
192. "[1][358]\\d{9}";// "[1]"代表第1位为数字1,"[358]"代表第二位可以为3、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。    
193. if (TextUtils.isEmpty(mobileNums))    
194. return false;    
195. else    
196. return mobileNums.matches(telRegex);    
197.     }    
198.     
199. /** 
200.      * progressbar 
201.      */    
202. private void createProgressBar() {    
203.         FrameLayout layout = (FrameLayout) findViewById(android.R.id.content);    
204. new FrameLayout.LayoutParams(    
205.                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);    
206.         layoutParams.gravity = Gravity.CENTER;    
207. new ProgressBar(this);    
208.         mProBar.setLayoutParams(layoutParams);    
209.         mProBar.setVisibility(View.VISIBLE);    
210.         layout.addView(mProBar);    
211.     }    
212.     
213. @Override    
214. protected void onDestroy() {    
215.         SMSSDK.unregisterAllEventHandler();    
216. super.onDestroy();    
217.     }    
218. }