Android短信驗(yàn)證碼(用的Mob短信驗(yàn)證)
Android短信驗(yàn)證碼功能,供大家參考,具體內(nèi)容如下
1、參考資料
Mob網(wǎng)站:http://www.mob.com/
Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android
教程的源代碼: http://git.oschina.net/lizhanqi/MobSMSDemo
Dialog教程:Android Dialog對(duì)話框
定時(shí)器教程:Android 實(shí)現(xiàn)定時(shí)器的四種方式
2、前期準(zhǔn)備
(1)Mob網(wǎng)站上下載SMS對(duì)應(yīng)的SDK,解壓出來為圖1,打開圖1,將其中的文件拷貝到as項(xiàng)目中的libs文件夾下,另外在add as library。
圖1
圖2
(2)在as項(xiàng)目中的AndroidManifest.xml文件中添加圖3所需權(quán)限,由于SMS權(quán)限為危險(xiǎn)權(quán)限,所以還要?jiǎng)討B(tài)申請(qǐng),這在下面代碼中會(huì)有體現(xiàn)。注意權(quán)限是寫在application外面,不是里面。
圖3
(3)如果圖4中的targetSdkVersion大于22,那么在代碼中必須動(dòng)態(tài)申請(qǐng)權(quán)限。
圖4
(4)在as項(xiàng)目中的圖7中的build.gradle文件中添加圖5和圖6紅色框中內(nèi)容。
圖5
圖6
圖7
(5)在Mob網(wǎng)站上申請(qǐng)App Key和App Secret。
圖8
(6)Toast
3、代碼(沒整理,將就看)
package com.gxu.lepao.activity; import android.Manifest; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Handler; import android.os.Message; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.gxu.lepao.R; import com.gxu.lepao.model.UserInfo; import org.litepal.crud.DataSupport;//LitePal開源數(shù)據(jù)庫(kù)框架 import java.util.List; import cn.smssdk.EventHandler;//Mob短信驗(yàn)證碼 import cn.smssdk.SMSSDK;//Mob短信驗(yàn)證碼 /** * Created by ljy on 2017-05-21. * 獲取和驗(yàn)證短信驗(yàn)證碼界面 */ public class RegisterActivity extends BaseActivity { private EditText phoneEdit; private EditText smsEdit; private Button getSms; private Button submitSms; private TextView login; private TextView reset; private CountDownTimer countDownTimer; //倒計(jì)時(shí) private int TIME = 60; //這是中國(guó)區(qū)號(hào),如果需要其他國(guó)家列表,可以使用getSupportedCountries();獲得國(guó)家區(qū)號(hào) public String country = "86"; //APPKEY private static String appKey = "1e0d15118480d"; // 填寫從短信SDK應(yīng)用后臺(tái)注冊(cè)得到的APPSECRET private static String appSecret = "daa97d794e2436abcae624ac3785d2ef"; //表示是否使用了registerEventHandler private boolean ready; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("RegisterActivity","Task; id is " + getTaskId()); setContentView(R.layout.activity_register); // 初始化界面 initView(); //初始化SMSSDK initSDK(); getSms.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { boolean isLogin = false; //判斷手機(jī)號(hào)碼是否已注冊(cè)過 isLogin = isRegister(); if(!TextUtils.isEmpty(phoneEdit.getText().toString())){ if(!isLogin){ //發(fā)送短信權(quán)限 if(ContextCompat.checkSelfPermission(RegisterActivity.this ,Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){ //顯示申請(qǐng)權(quán)限彈窗 showRequestPermission(); }else{ //彈窗確認(rèn) alterWarning(); } }else{ Toast.makeText(RegisterActivity.this,"此手機(jī)號(hào)碼已經(jīng)注冊(cè)過",Toast.LENGTH_SHORT).show(); } }else{ Toast.makeText(RegisterActivity.this,"請(qǐng)輸入手機(jī)號(hào)碼",Toast.LENGTH_SHORT).show(); } } }); submitSms.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { String sms = smsEdit.getText().toString(); String phone = phoneEdit.getText().toString(); if(!TextUtils.isEmpty(sms)){ SMSSDK.submitVerificationCode( country, phone, sms); }else{ Toast.makeText(RegisterActivity.this,"請(qǐng)輸入驗(yàn)證碼",Toast.LENGTH_SHORT).show(); } } }); login.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(RegisterActivity.this,LoginActivity.class); startActivity(intent); } }); reset.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent = new Intent(RegisterActivity.this,ResetPwdActivity.class); startActivity(intent); } }); } //申請(qǐng)權(quán)限彈窗 private void showRequestPermission(){ //先new出一個(gè)監(jiān)聽器,設(shè)置好監(jiān)聽 DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { switch(which){ case Dialog.BUTTON_POSITIVE: //接收短信權(quán)限 ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.RECEIVE_SMS},1); //發(fā)送短信權(quán)限 ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.SEND_SMS},2); //彈窗確認(rèn) alterWarning(); break; case Dialog.BUTTON_NEGATIVE: Toast.makeText(RegisterActivity.this, "拒絕" + which, Toast.LENGTH_SHORT).show(); break; } } }; //dialog參數(shù)設(shè)置 AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); //先得到構(gòu)造器 builder.setTitle("申請(qǐng)權(quán)限"); //設(shè)置標(biāo)題 builder.setMessage("要允許lepao接收驗(yàn)證碼短信嗎?"); //設(shè)置內(nèi)容 builder.setIcon(R.mipmap.ic_launcher);//設(shè)置圖標(biāo),圖片id即可 builder.setPositiveButton("允許",dialogOnclicListener); builder.setNegativeButton("拒絕", dialogOnclicListener); builder.create().show(); } //申請(qǐng)權(quán)限 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode){ case 1: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ //initSDK(); Toast.makeText(this,"你授權(quán)。。。接收短信權(quán)限",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"你拒絕。。。接收短信權(quán)限",Toast.LENGTH_SHORT).show(); } break; case 2: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"你授權(quán)。。。發(fā)送短信權(quán)限",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"你拒絕。。。發(fā)送短信權(quán)限",Toast.LENGTH_SHORT).show(); } break; default: } } // 初始化短信SDK private void initSDK() { SMSSDK.initSDK(this, appKey, appSecret, true); //final Handler handler = new Handler(); EventHandler eventHandler = new EventHandler() { public void afterEvent(int event, int result, Object data) { //回調(diào)完成 if (result == SMSSDK.RESULT_COMPLETE) { //驗(yàn)證碼驗(yàn)證成功 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { toast("驗(yàn)證成功"); Intent intent = new Intent(RegisterActivity.this,SetPwdActivity.class); intent.putExtra("phone",phoneEdit.getText().toString()); startActivity(intent); finish(); } //已發(fā)送驗(yàn)證碼 else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { toast("驗(yàn)證碼已經(jīng)發(fā)送"); } else { ((Throwable) data).printStackTrace(); String str = data.toString(); toast(str); } } if(result==SMSSDK.RESULT_ERROR) { toast("驗(yàn)證碼錯(cuò)誤"); } } }; // 注冊(cè)回調(diào)監(jiān)聽接口 SMSSDK.registerEventHandler(eventHandler); ready = true; } //吐司的一個(gè)小方法 private void toast(final String str) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(RegisterActivity.this, str, Toast.LENGTH_SHORT).show(); } }); } //銷毀短信注冊(cè) @Override protected void onDestroy() { // 注銷回調(diào)接口registerEventHandler必須和unregisterEventHandler配套使用,否則可能造成內(nèi)存泄漏。 if(ready){ SMSSDK.unregisterAllEventHandler(); } super.onDestroy(); } //初始化界面 private void initView(){ phoneEdit = (EditText) findViewById(R.id.phone); smsEdit = (EditText) findViewById(R.id.sms); getSms = (Button) findViewById(R.id.getSms); submitSms = (Button) findViewById(R.id.submitSms); login = (TextView) findViewById(R.id.login); reset = (TextView) findViewById(R.id.reset); } //彈窗確認(rèn) private void alterWarning(){ //先new出一個(gè)監(jiān)聽器,設(shè)置好監(jiān)聽 DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { switch(which){ case Dialog.BUTTON_POSITIVE: dialog.dismiss(); //通過sdk發(fā)送短信驗(yàn)證(請(qǐng)求獲取短信驗(yàn)證碼,在監(jiān)聽(eventHandle)中返回) SMSSDK.getVerificationCode(country, phoneEdit.getText().toString()); //設(shè)置獲取驗(yàn)證碼按鈕不能點(diǎn)擊 getSms.setClickable(false); //倒計(jì)時(shí),執(zhí)行次數(shù)為(TIME+1)*1000/1000,countDownTimer每次執(zhí)行間隔:1000(單位為毫秒) countDownTimer = new CountDownTimer((TIME+1)*1000, 1000) { @Override public void onTick(long millisUntilFinished) { getSms.setText(TIME-- + "秒后再次獲取驗(yàn)證碼"); } @Override public void onFinish() { //設(shè)置獲取驗(yàn)證碼按鈕可以點(diǎn)擊 getSms.setClickable(true); getSms.setText("點(diǎn)擊獲取短信驗(yàn)證碼"); } }; countDownTimer.start(); break; case Dialog.BUTTON_NEGATIVE: dialog.dismiss(); Toast.makeText(RegisterActivity.this, "已取消", Toast.LENGTH_SHORT).show(); break; } } }; //dialog參數(shù)設(shè)置 AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到構(gòu)造器 builder.setTitle("發(fā)送短信"); //設(shè)置標(biāo)題 builder.setMessage("我們將把驗(yàn)證碼發(fā)送到以下號(hào)碼:\n"+country+"-"+phoneEdit.getText().toString()); //設(shè)置內(nèi)容 builder.setIcon(R.drawable.icon);//設(shè)置圖標(biāo),圖片id即可 builder.setPositiveButton("確認(rèn)",dialogOnclicListener); builder.setNegativeButton("取消", dialogOnclicListener); builder.create().show(); } //判斷手機(jī)號(hào)碼是否已注冊(cè)過 public boolean isRegister(){ boolean isLogin = false; 。。。。。299 return isLogin; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter簡(jiǎn)潔實(shí)用的圖片編輯器的實(shí)現(xiàn)
本文主要介紹了Flutter簡(jiǎn)潔實(shí)用的圖片編輯器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02詳解dex優(yōu)化對(duì)Arouter查找路徑的影響
dex簡(jiǎn)單說就是優(yōu)化后的android版.exe。每個(gè)apk安裝包里都有。相對(duì)于PC上的java虛擬機(jī)能運(yùn)行.class,android上的Davlik虛擬機(jī)能運(yùn)行.dex。本文將著重介紹dex優(yōu)化對(duì)Arouter查找路徑的影響2021-06-06Android實(shí)現(xiàn)可復(fù)用的選擇頁(yè)面
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可復(fù)用的選擇頁(yè)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Android SeekBar實(shí)現(xiàn)平滑滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android SeekBar實(shí)現(xiàn)平滑滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03