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對話框
定時器教程:Android 實(shí)現(xiàn)定時器的四種方式
2、前期準(zhǔn)備
(1)Mob網(wǎng)站上下載SMS對應(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)限為危險權(quán)限,所以還要動態(tài)申請,這在下面代碼中會有體現(xiàn)。注意權(quán)限是寫在application外面,不是里面。

圖3
(3)如果圖4中的targetSdkVersion大于22,那么在代碼中必須動態(tài)申請權(quán)限。

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

圖5

圖6

圖7
(5)在Mob網(wǎ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ù)庫框架
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;
//倒計時
private int TIME = 60;
//這是中國區(qū)號,如果需要其他國家列表,可以使用getSupportedCountries();獲得國家區(qū)號
public String country = "86";
//APPKEY
private static String appKey = "1e0d15118480d";
// 填寫從短信SDK應(yīng)用后臺注冊得到的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ī)號碼是否已注冊過
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){
//顯示申請權(quán)限彈窗
showRequestPermission();
}else{
//彈窗確認(rèn)
alterWarning();
}
}else{
Toast.makeText(RegisterActivity.this,"此手機(jī)號碼已經(jīng)注冊過",Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(RegisterActivity.this,"請輸入手機(jī)號碼",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,"請輸入驗(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);
}
});
}
//申請權(quán)限彈窗
private void showRequestPermission(){
//先new出一個監(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("申請權(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();
}
//申請權(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)證碼錯誤");
}
}
};
// 注冊回調(diào)監(jiān)聽接口
SMSSDK.registerEventHandler(eventHandler);
ready = true;
}
//吐司的一個小方法
private void toast(final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(RegisterActivity.this, str, Toast.LENGTH_SHORT).show();
}
});
}
//銷毀短信注冊
@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出一個監(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)證(請求獲取短信驗(yàn)證碼,在監(jiān)聽(eventHandle)中返回)
SMSSDK.getVerificationCode(country, phoneEdit.getText().toString());
//設(shè)置獲取驗(yàn)證碼按鈕不能點(diǎn)擊
getSms.setClickable(false);
//倒計時,執(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ā)送到以下號碼:\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ī)號碼是否已注冊過
public boolean isRegister(){
boolean isLogin = false;
。。。。。299 return isLogin;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter簡潔實(shí)用的圖片編輯器的實(shí)現(xiàn)
本文主要介紹了Flutter簡潔實(shí)用的圖片編輯器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Android實(shí)現(xiàn)可復(fù)用的選擇頁面
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可復(fù)用的選擇頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
Android SeekBar實(shí)現(xiàn)平滑滾動
這篇文章主要為大家詳細(xì)介紹了Android SeekBar實(shí)現(xiàn)平滑滾動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03

