Android之簡訊驗證碼(用的Mob簡訊驗證)

来源:http://www.cnblogs.com/landiljy/archive/2017/05/23/6894927.html
-Advertisement-
Play Games

1、參考資料 Mob網站:http://www.mob.com/ Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android 教程:http://www.cnblogs.com/lizhanqi/p/5720962.html 教程的源代碼 ...


1、參考資料

Mob網站:http://www.mob.com/

Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android

教程:http://www.cnblogs.com/lizhanqi/p/5720962.html            

教程的源代碼:  http://git.oschina.net/lizhanqi/MobSMSDemo

 

Dialog教程:http://blog.csdn.net/liang5630/article/details/44098899

定時器教程:http://www.cnblogs.com/wansho/p/5104335.html

 

2、前期準備

(1)Mob網站上下載SMS對應的SDK,解壓出來為圖1,打開圖1,將其中的文件拷貝到as項目中的libs文件夾下,另外在add as library

圖1

圖2

(2)在as項目中的AndroidManifest.xml文件中添加圖3所需許可權,由於SMS許可權為危險許可權,所以還要動態申請,這在下麵代碼中會有體現。註意許可權是寫在application外面,不是裡面。

圖3

(3)如果圖4中的targetSdkVersion大於22,那麼在代碼中必須動態申請許可權。

圖4

(4)在as項目中的圖7中的build.gradle文件中添加圖5和圖6紅色框中內容。

圖5

圖6

圖7

 

(5)在Mob網站上申請App Key和App Secret。

圖8

 (6)Toast

 

3、代碼(沒整理,將就看)

 

  1 package com.gxu.lepao.activity;
  2 
  3 import android.Manifest;
  4 import android.app.Dialog;
  5 import android.content.DialogInterface;
  6 import android.content.Intent;
  7 import android.content.pm.PackageManager;
  8 import android.os.Bundle;
  9 import android.os.CountDownTimer;
 10 import android.os.Handler;
 11 import android.os.Message;
 12 import android.support.v4.app.ActivityCompat;
 13 import android.support.v4.content.ContextCompat;
 14 import android.support.v7.app.AlertDialog;
 15 import android.text.TextUtils;
 16 import android.util.Log;
 17 import android.view.View;
 18 import android.widget.Button;
 19 import android.widget.EditText;
 20 import android.widget.TextView;
 21 import android.widget.Toast;
 22 import com.gxu.lepao.R;
 23 import com.gxu.lepao.model.UserInfo;
 24 import org.litepal.crud.DataSupport;//LitePal開源資料庫框架
 25 import java.util.List;
 26 import cn.smssdk.EventHandler;//Mob簡訊驗證碼
 27 import cn.smssdk.SMSSDK;//Mob簡訊驗證碼
 28 
 29 /**
 30  * Created by ljy on 2017-05-21.
 31  * 獲取和驗證簡訊驗證碼界面
 32  */
 33 
 34 public class RegisterActivity extends BaseActivity {
 35 
 36     private EditText phoneEdit;
 37     private EditText smsEdit;
 38     private Button getSms;
 39     private Button submitSms;
 40     private TextView login;
 41     private TextView reset;
 42     private CountDownTimer countDownTimer;
 43     //倒計時
 44     private int TIME = 60;
 45     //這是中國區號,如果需要其他國家列表,可以使用getSupportedCountries();獲得國家區號
 46     public String country = "86";
 47     //APPKEY
 48     private static String appKey = "1e0d15118480d";
 49     // 填寫從簡訊SDK應用後臺註冊得到的APPSECRET
 50     private static String appSecret = "daa97d794e2436abcae624ac3785d2ef";
 51     //表示是否使用了registerEventHandler
 52     private boolean ready;
 53 
 54 
 55     @Override
 56     protected void onCreate(Bundle savedInstanceState) {
 57         super.onCreate(savedInstanceState);
 58         Log.d("RegisterActivity","Task; id is " + getTaskId());
 59         setContentView(R.layout.activity_register);
 60         // 初始化界面
 61         initView();
 62         //初始化SMSSDK
 63         initSDK();
 64         getSms.setOnClickListener(new View.OnClickListener(){
 65             @Override
 66             public void onClick(View v) {
 67                 boolean isLogin = false;
 68                 //判斷手機號碼是否已註冊過
 69                 isLogin = isRegister();
 70                 if(!TextUtils.isEmpty(phoneEdit.getText().toString())){
 71                     if(!isLogin){
 72                          //發送簡訊許可權
 73                         if(ContextCompat.checkSelfPermission(RegisterActivity.this
 74                                 ,Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){
 75                             //顯示申請許可權彈窗
 76                             showRequestPermission();
 77                         }else{
 78                             //彈窗確認
 79                             alterWarning();
 80                         }
 81                     }else{
 82                         Toast.makeText(RegisterActivity.this,"此手機號碼已經註冊過",Toast.LENGTH_SHORT).show();
 83                     }
 84                 }else{
 85                     Toast.makeText(RegisterActivity.this,"請輸入手機號碼",Toast.LENGTH_SHORT).show();
 86                 }
 87             }
 88         });
 89         submitSms.setOnClickListener(new View.OnClickListener(){
 90             @Override
 91             public void onClick(View v) {
 92                 String sms = smsEdit.getText().toString();
 93                 String phone = phoneEdit.getText().toString();
 94                 if(!TextUtils.isEmpty(sms)){
 95                     SMSSDK.submitVerificationCode( country,  phone,  sms);
 96                 }else{
 97                     Toast.makeText(RegisterActivity.this,"請輸入驗證碼",Toast.LENGTH_SHORT).show();
 98                 }
 99             }
100         });
101         login.setOnClickListener(new View.OnClickListener(){
102             @Override
103             public void onClick(View v) {
104                 Intent intent = new Intent(RegisterActivity.this,LoginActivity.class);
105                 startActivity(intent);
106             }
107         });
108         reset.setOnClickListener(new View.OnClickListener(){
109             @Override
110             public void onClick(View v) {
111                 Intent intent = new Intent(RegisterActivity.this,ResetPwdActivity.class);
112                 startActivity(intent);
113             }
114         });
115     }
116 
117     //申請許可權彈窗
118     private void showRequestPermission(){
119         //先new出一個監聽器,設置好監聽
120         DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
121             @Override
122             public void onClick(DialogInterface dialog, int which) {
123                 switch(which){
124                     case Dialog.BUTTON_POSITIVE:
125                         //接收簡訊許可權
126                         ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.RECEIVE_SMS},1);
127                        //發送簡訊許可權
128                         ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.SEND_SMS},2);
129                         //彈窗確認
130                         alterWarning();
131                         break;
132                     case Dialog.BUTTON_NEGATIVE:
133                         Toast.makeText(RegisterActivity.this, "拒絕" + which, Toast.LENGTH_SHORT).show();
134                         break;
135                 }
136             }
137         };
138         //dialog參數設置
139         AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this);  //先得到構造器
140         builder.setTitle("申請許可權"); //設置標題
141         builder.setMessage("要允許lepao接收驗證碼簡訊嗎?"); //設置內容
142         builder.setIcon(R.mipmap.ic_launcher);//設置圖標,圖片id即可
143         builder.setPositiveButton("允許",dialogOnclicListener);
144         builder.setNegativeButton("拒絕", dialogOnclicListener);
145         builder.create().show();
146     }
147 
148     //申請許可權
149     public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
150         switch (requestCode){
151             case 1:
152                 if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
153                     //initSDK();
154                     Toast.makeText(this,"你授權。。。接收簡訊許可權",Toast.LENGTH_SHORT).show();
155                 }else{
156                     Toast.makeText(this,"你拒絕。。。接收簡訊許可權",Toast.LENGTH_SHORT).show();
157                 }
158                 break;
159             case 2:
160                 if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
161                     Toast.makeText(this,"你授權。。。發送簡訊許可權",Toast.LENGTH_SHORT).show();
162                 }else{
163                     Toast.makeText(this,"你拒絕。。。發送簡訊許可權",Toast.LENGTH_SHORT).show();
164                 }
165                 break;
166             default:
167         }
168     }
169 
170     // 初始化簡訊SDK
171     private void initSDK() {
172         SMSSDK.initSDK(this, appKey, appSecret, true);
173         //final Handler handler = new Handler();
174         EventHandler eventHandler = new EventHandler() {
175             public void afterEvent(int event, int result, Object data) {
176                 //回調完成
177                 if (result == SMSSDK.RESULT_COMPLETE)
178                 {
179                     //驗證碼驗證成功
180                     if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
181                     {
182                         toast("驗證成功");
183                         Intent intent = new Intent(RegisterActivity.this,SetPwdActivity.class);
184                         intent.putExtra("phone",phoneEdit.getText().toString());
185                         startActivity(intent);
186                         finish();
187                     }
188                     //已發送驗證碼
189                     else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
190                     {
191                         toast("驗證碼已經發送");
192                     } else
193                     {
194                         ((Throwable) data).printStackTrace();
195                         String str = data.toString();
196                         toast(str);
197                     }
198                 }
199                 if(result==SMSSDK.RESULT_ERROR) {
200                     toast("驗證碼錯誤");
201                 }
202 
203             }
204         };
205         // 註冊回調監聽介面
206         SMSSDK.registerEventHandler(eventHandler);
207         ready = true;
208     }
209 
210     //吐司的一個小方法
211     private void toast(final String str) {
212         runOnUiThread(new Runnable() {
213             @Override
214             public void run() {
215                 Toast.makeText(RegisterActivity.this, str, Toast.LENGTH_SHORT).show();
216             }
217         });
218     }
219 
220 
221 
222     //銷毀簡訊註冊
223     @Override
224     protected void onDestroy() {
225         // 註銷回調介面registerEventHandler必須和unregisterEventHandler配套使用,否則可能造成記憶體泄漏。
226         if(ready){
227             SMSSDK.unregisterAllEventHandler();
228         }
229         super.onDestroy();
230     }
231 
232     //初始化界面
233     private void initView(){
234         phoneEdit = (EditText) findViewById(R.id.phone);
235         smsEdit = (EditText) findViewById(R.id.sms);
236         getSms = (Button) findViewById(R.id.getSms);
237         submitSms = (Button) findViewById(R.id.submitSms);
238         login = (TextView) findViewById(R.id.login);
239         reset = (TextView) findViewById(R.id.reset);
240     }
241 
242     //彈窗確認
243     private void alterWarning(){
244         //先new出一個監聽器,設置好監聽
245         DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
246             @Override
247             public void onClick(DialogInterface dialog, int which) {
248                 switch(which){
249                     case Dialog.BUTTON_POSITIVE:
250                         dialog.dismiss();
251                         //通過sdk發送簡訊驗證(請求獲取簡訊驗證碼,在監聽(eventHandle)中返回)
252                         SMSSDK.getVerificationCode(country, phoneEdit.getText().toString());
253                         //設置獲取驗證碼按鈕不能點擊
254                         getSms.setClickable(false);
255                         //倒計時,執行次數為(TIME+1)*1000/1000,countDownTimer每次執行間隔:1000(單位為毫秒)
256                         countDownTimer  = new CountDownTimer((TIME+1)*1000, 1000) {
257                             @Override
258                             public void onTick(long millisUntilFinished) {
259                                 getSms.setText(TIME-- + "秒後再次獲取驗證碼");
260                             }
261 
262                             @Override
263                             public void onFinish() {
264                                 //設置獲取驗證碼按鈕可以點擊
265                                 getSms.setClickable(true);
266                                 getSms.setText("點擊獲取簡訊驗證碼");
267                             }
268                         };
269                         countDownTimer.start();
270                         break;
271                     case Dialog.BUTTON_NEGATIVE:
272                         dialog.dismiss();
273                         Toast.makeText(RegisterActivity.this, "已取消", Toast.LENGTH_SHORT).show();
274                         break;
275                 }
276             }
277         };
278         //dialog參數設置
279         AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到構造器
280         builder.setTitle("發送簡訊"); //設置標題
281         builder.setMessage("我們將把驗證碼發送到以下號碼:\n"+country+"-"+phoneEdit.getText().toString()); //設置內容
282         builder.setIcon(R.drawable.icon);//設置圖標,圖片id即可
283         builder.setPositiveButton("確認",dialogOnclicListener);
284         builder.setNegativeButton("取消", dialogOnclicListener);
285         builder.create().show();
286     }
287 
288     //判斷手機號碼是否已註冊過
289     public boolean isRegister(){
290         boolean isLogin = false;
291         。。。。。299         return isLogin;
300     }
301 
302 
303 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 $(function() { 2 $("#CheckMainCompany").change(function () { 3 if ($("#CheckMainCompany").is(':checked')) { 4 5 alert... ...
  • 1.滾動條預設是在html上的,移到body上 2.高清屏1px邊框還原 3.使用單位 px絕對單位,任何情況下都是固定值,在不同尺寸的屏幕下會錯位。 % 相對單位,相對於父級(自身)的大小進行計算。對於不太好確定值的地方(如高度)不好使用百分比,會導致變形。 em相對單位,相對於當前字體大小的倍數 ...
  • 關於表格寬度的渲染規則 表格單元格寬度的計算方式主要分為兩種方式:固定表格佈局、自動表格佈局,這個經常寫css的人應該還是知道的,但是我們經常會發現給表格列定了寬度不起作用,又或是沒有定寬度渲染出來的卻是正常的嗎,下麵就來介紹下這兩個方式具體是怎麼計算渲染的。 先設定幾個通用的變數: tableWi ...
  • 複製粘貼前隨手點個贊哦~~ //獲取地址欄參數 //url為空時為調用當前url地址 //調用方法為 var params = getPatams(); function getParams(url) { var theRequest = new Object(); if (!url) url = ... ...
  • 一、創建數組 使用 new 操作符調用構造函數 var arr = new Array(20) // 創建了一個包含20項的數組 var arr = new Array('a', 'b', 'c') // 創建了包含字元串 a b c 的三項數組 省略 new 操作符 var arr = Array ...
  • 效果圖如下: 1.activity_main.xml menu_shop_car_selected.png corner_view.xml 2.adapter_shopping_cart_item.xml 3.MainActivity 4.GoodsAdapter 5.GoodsModel http ...
  • 對於微信滑動關閉activity的功能,我一直覺得挺酷,想在自己的項目上也加上這個功能。網上找了一下發現一個不錯的思路。 使用ViewDragHelper。 首先要讓activity在滑動的時候下麵的activity能夠看得到,那麼就得設置activity的主題,讓activity的視窗變透明。 該 ...
  • Precondition : 配有 power path 功能的 BQ2589 手機。 接上 pc usb port。 Origin : 今天有同事問我, 手機是否可以在接上 pc usb port 時,讓手機停充, 有以下幾種停充, 停充_1 : BQ25896 有 power path 的功能, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...