如何在Android开发中利用Mob实现一个短信验证码?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
前期准备
(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、代码(没整理,将就看)
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开源数据库框架import java.util.List;import cn.smssdk.EventHandler;//Mob短信验证码import cn.smssdk.SMSSDK;//Mob短信验证码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; //这是中国区号,如果需要其他国家列表,可以使用getSupportedCountries();获得国家区号 public String country = "86"; //APPKEY private static String appKey = "1e0d15118480d"; // 填写从短信SDK应用后台注册得到的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; //判断手机号码是否已注册过 isLogin = isRegister(); if(!TextUtils.isEmpty(phoneEdit.getText().toString())){ if(!isLogin){ //发送短信权限 if(ContextCompat.checkSelfPermission(RegisterActivity.this ,Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED){ //显示申请权限弹窗 showRequestPermission(); }else{ //弹窗确认 alterWarning(); } }else{ Toast.makeText(RegisterActivity.this,"此手机号码已经注册过",Toast.LENGTH_SHORT).show(); } }else{ Toast.makeText(RegisterActivity.this,"请输入手机号码",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,"请输入验证码",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); } }); } //申请权限弹窗 private void showRequestPermission(){ //先new出一个监听器,设置好监听 DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { switch(which){ case Dialog.BUTTON_POSITIVE: //接收短信权限 ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.RECEIVE_SMS},1); //发送短信权限 ActivityCompat.requestPermissions(RegisterActivity.this,new String[]{Manifest.permission.SEND_SMS},2); //弹窗确认 alterWarning(); break; case Dialog.BUTTON_NEGATIVE: Toast.makeText(RegisterActivity.this, "拒绝" + which, Toast.LENGTH_SHORT).show(); break; } } }; //dialog参数设置 AlertDialog.Builder builder=new AlertDialog.Builder(RegisterActivity.this); //先得到构造器 builder.setTitle("申请权限"); //设置 builder.setMessage("要允许lepao接收验证码短信吗?"); //设置内容 builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可 builder.setPositiveButton("允许",dialogOnclicListener); builder.setNegativeButton("拒绝", dialogOnclicListener); builder.create().show(); } //申请权限 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,"你授权。。。接收短信权限",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"你拒绝。。。接收短信权限",Toast.LENGTH_SHORT).show(); } break; case 2: if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"你授权。。。发送短信权限",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"你拒绝。。。发送短信权限",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) { //回调完成 if (result == SMSSDK.RESULT_COMPLETE) { //验证码验证成功 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { toast("验证成功"); Intent intent = new Intent(RegisterActivity.this,SetPwdActivity.class); intent.putExtra("phone",phoneEdit.getText().toString()); startActivity(intent); finish(); } //已发送验证码 else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { toast("验证码已经发送"); } else { ((Throwable) data).printStackTrace(); String str = data.toString(); toast(str); } } if(result==SMSSDK.RESULT_ERROR) { toast("验证码错误"); } } }; // 注册回调监听接口 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() { // 注销回调接口registerEventHandler必须和unregisterEventHandler配套使用,否则可能造成内存泄漏。 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); } //弹窗确认 private void alterWarning(){ //先new出一个监听器,设置好监听 DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { switch(which){ case Dialog.BUTTON_POSITIVE: dialog.dismiss(); //通过sdk发送短信验证(请求获取短信验证码,在监听(eventHandle)中返回) SMSSDK.getVerificationCode(country, phoneEdit.getText().toString()); //设置获取验证码按钮不能点击 getSms.setClickable(false); //倒计时,执行次数为(TIME+1)*1000/1000,countDownTimer每次执行间隔:1000(单位为毫秒) countDownTimer = new CountDownTimer((TIME+1)*1000, 1000) { @Override public void onTick(long millisUntilFinished) { getSms.setText(TIME-- + "秒后再次获取验证码"); } @Override public void onFinish() { //设置获取验证码按钮可以点击 getSms.setClickable(true); getSms.setText("点击获取短信验证码"); } }; countDownTimer.start(); break; case Dialog.BUTTON_NEGATIVE: dialog.dismiss(); Toast.makeText(RegisterActivity.this, "已取消", Toast.LENGTH_SHORT).show(); break; } } }; //dialog参数设置 AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器 builder.setTitle("发送短信"); //设置 builder.setMessage("我们将把验证码发送到以下号码:\n"+country+"-"+phoneEdit.getText().toString()); //设置内容 builder.setIcon(R.drawable.icon);//设置图标,图片id即可 builder.setPositiveButton("确认",dialogOnclicListener); builder.setNegativeButton("取消", dialogOnclicListener); builder.create().show(); } //判断手机号码是否已注册过 public boolean isRegister(){ boolean isLogin = false; 。。。。。299 return isLogin; }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Uncomtrade数据库异地备份指南
- CORS 在微服务架构中的应用场景有哪些?(cors在微服务架构中的应用场景)
- 如何在 Java 中创建 Maven 项目?(java怎么创建maven项目)
- 如何高效使用Uncomtrade数据库进行查询
- Java 配置环境变量后如何进行使用操作?(java配置环境变量后如何使用)
- Java 中防止接口重复提交的方法有哪些?(java接口防止重复提交的方法是什么)
- 如何提高 Java Office 的性能?(java office 怎样提高性能 )
- Java 抽象工厂模式的优缺点有哪些?(java抽象工厂模式有哪些优缺点)
- 在 Java 中,charsequence 的具体用法究竟是什么?(java中charsequence的用法是什么)
- 如何利用 Java Quarter 进行数据挖掘?(java quarter如何进行数据挖掘)