Android开发中关于短息验证码的设计层出不穷,越来越多的应用为了更好的提高软件的安全性,开始使用通过服务器向用户发送验证码的方式,来保护用户个人信息的安全性。无论是用户注册时的信息验证还是当用户发出找回密码请求时的短信验证,他们的工作原理大致上是一致的,因为项目的需要研究了一下关于这方面的知识。

众所周知,短信验证需要服务器端生成一个验证码,然后发送到用户输入的手机上,这个过程需要服务器主动向客户发送验证短信,所以这是就需要一个移动或联通的发送短息接口,由于本人目前尚处于学生阶段,没有获得这个接口的权限,所以我就选择了借助网上的移动开发服务平台,来完成这个功能的实现,这里我借用的平台是:http://dashboard.mob.com/,大家可以关注一下,这个平台为我们开发移动应用提供了很好的技术指导。

官方为我们提供了两种设计方式:第一种调用内部GUI实现;另一种通过自定义GUI实现,对于第一种方式,我就不再多讲,因为官方文档提供了很详细的实行步骤,大家只需要按照上面的步骤去实现即可,没有难度。本篇我将带领大家通过自定义GUI实现短信验证功能。首先开发之前你可以先查阅一下官方提供的无GUI API,然后下载一下官方提供的dome,做好这些工作之后,我们就可以开始我们的设计了。

1、将demo中的libs下的SMSSDK-1.1.5.jar和armeabi文件夹拷贝到我们项目的libs目录下,这是官方提供的类库jar包。

2、在AndroidManifest.xml文件添加权限和声明Action:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.android_sms"android:versionCode="1"android:versionName="1.0" ><uses-sdk
        android:minSdkVersion="8"android:targetSdkVersion="18" /><uses-permission android:name="android.permission.READ_CONTACTS" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.RECEIVE_SMS" /><uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><application
        android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activity
            android:name="com.example.android_sms.MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity
            android:name="cn.smssdk.SMSSDKUIShell"android:configChanges="keyboardHidden|orientation|screenSize"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:windowSoftInputMode="stateHidden|adjustResize" /></application>
</manifest>

3、设计我们的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginTop="20dp"android:text="短信验证"android:textColor="#00ffaa"android:textSize="20dp" /><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_below="@+id/textView2"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:text="手机号:" /><EditTextandroid:id="@+id/phone"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/textView1"android:layout_alignBottom="@+id/textView1"android:layout_toRightOf="@+id/textView1"android:maxLength="11"android:ems="11"android:inputType="phone" ><requestFocus /></EditText><TextViewandroid:id="@+id/textView3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/textView1"android:layout_marginTop="40dp"android:layout_below="@+id/phone"android:text="验证码:"/><EditTextandroid:id="@+id/cord"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:layout_alignBaseline="@+id/textView3"android:layout_alignBottom="@+id/textView3"android:layout_alignLeft="@+id/phone"android:ems="4"android:maxLength="4"android:inputType="phone" /><Buttonandroid:id="@+id/getcord"style="?android:attr/buttonStyleSmall"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@+id/cord"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"android:layout_toRightOf="@+id/cord"android:visibility="visible"android:text="获取验证码" /><Buttonandroid:id="@+id/savecord"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@+id/cord"android:layout_margin="20dp"android:text="验证" /><TextViewandroid:id="@+id/now"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_above="@+id/savecord"android:layout_toRightOf="@+id/cord"android:gravity="center_horizontal"android:visibility="gone"android:text="提示信息"android:textColor="#aaaaaa" /></RelativeLayout>

4、我们的MainActivity:

public class MainActivity extends Activity implements OnClickListener{private EditText phone;private EditText cord;private TextView now;private Button getCord;private Button saveCord;private String iPhone;private String iCord;private int time = 60;private boolean flag = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);init();SMSSDK.initSDK(this, "<您的appkey>", "<您的appsecret>");EventHandler eh=new EventHandler(){@Overridepublic void afterEvent(int event, int result, Object data) {Message msg = new Message();msg.arg1 = event;msg.arg2 = result;msg.obj = data;handler.sendMessage(msg);}};SMSSDK.registerEventHandler(eh);}private void init() {phone = (EditText) findViewById(R.id.phone);cord = (EditText) findViewById(R.id.cord);now = (TextView) findViewById(R.id.now);getCord = (Button) findViewById(R.id.getcord);saveCord = (Button) findViewById(R.id.savecord);getCord.setOnClickListener(this);saveCord.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.getcord:if(!TextUtils.isEmpty(phone.getText().toString().trim())){if(phone.getText().toString().trim().length()==11){iPhone = phone.getText().toString().trim();SMSSDK.getVerificationCode("86",iPhone);cord.requestFocus();getCord.setVisibility(View.GONE);}else{Toast.makeText(MainActivity.this, "请输入完整电话号码", Toast.LENGTH_LONG).show();phone.requestFocus();}}else{Toast.makeText(MainActivity.this, "请输入您的电话号码", Toast.LENGTH_LONG).show();phone.requestFocus();}break;case R.id.savecord:if(!TextUtils.isEmpty(cord.getText().toString().trim())){if(cord.getText().toString().trim().length()==4){iCord = cord.getText().toString().trim();SMSSDK.submitVerificationCode("86", iPhone, iCord);flag = false;}else{Toast.makeText(MainActivity.this, "请输入完整验证码", Toast.LENGTH_LONG).show();cord.requestFocus();}}else{Toast.makeText(MainActivity.this, "请输入验证码", Toast.LENGTH_LONG).show();cord.requestFocus();}break;default:break;}}//验证码送成功后提示文字private void reminderText() {now.setVisibility(View.VISIBLE);handlerText.sendEmptyMessageDelayed(1, 1000);}Handler handlerText =new Handler(){public void handleMessage(Message msg) {if(msg.what==1){if(time>0){now.setText("验证码已发送"+time+"秒");time--;handlerText.sendEmptyMessageDelayed(1, 1000);}else{now.setText("提示信息");time = 60;now.setVisibility(View.GONE);getCord.setVisibility(View.VISIBLE);}}else{cord.setText("");now.setText("提示信息");time = 60;now.setVisibility(View.GONE);getCord.setVisibility(View.VISIBLE);}};};Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);int event = msg.arg1;int result = msg.arg2;Object data = msg.obj;Log.e("event", "event="+event);if (result == SMSSDK.RESULT_COMPLETE) {//短信注册成功后,返回MainActivity,然后提示新好友if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {//提交验证码成功,验证通过Toast.makeText(getApplicationContext(), "验证码校验成功", Toast.LENGTH_SHORT).show();handlerText.sendEmptyMessage(2);} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){//服务器验证码发送成功reminderText();Toast.makeText(getApplicationContext(), "验证码已经发送", Toast.LENGTH_SHORT).show();}else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){//返回支持发送验证码的国家列表Toast.makeText(getApplicationContext(), "获取国家列表成功", Toast.LENGTH_SHORT).show();}} else {if(flag){getCord.setVisibility(View.VISIBLE);Toast.makeText(MainActivity.this, "验证码获取失败,请重新获取", Toast.LENGTH_SHORT).show();phone.requestFocus();}else{((Throwable) data).printStackTrace();int resId = getStringRes(MainActivity.this, "smssdk_network_error");Toast.makeText(MainActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();cord.selectAll();if (resId > 0) {Toast.makeText(MainActivity.this, resId, Toast.LENGTH_SHORT).show();}}}}};@Overrideprotected void onDestroy() {super.onDestroy();SMSSDK.unregisterAllEventHandler();}}

注:appkey和appsecret:在http://dashboard.mob.com/注册一个账号后,创建一个发送短信的应用,系统会自动为生成appkey和appsecret

handlerText是我自定义设计的Handker对象,用于当服务器发送验证码后,提醒用户注意。

实现效果图如下:

安卓开发实现短信验证码的功能相关推荐

  1. php调用nexmo发送短信,在 Laravel 中 “规范” 的开发短信验证码发送功能

    Laravel简介 Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行 ...

  2. 手机短信验证码登录功能的开发实录(机器识别码、短信限流、错误提示、发送验证码倒计时60秒)

    短信验证码登录功能 项目分析 核心代码 1.外部js库调用 2.HTML容器构建 3.javaScript业务逻辑验证 4.后端验证逻辑 总结 短信验证码是通过发送验证码到手机的一种有效的验证码系统, ...

  3. Android开发之短信验证码示例

    在说Android中的短信验证码这个知识点前,我们首先来了解下聚合数据 聚合数据介绍 聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务.免费提供从天气查询.空气质量.地图坐标到金融 ...

  4. 利用聚合数据API进行Android开发之短信验证码

    在说Android中的短信验证码这个知识点前,我们首先来了解下聚合数据 聚合数据介绍 聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务.免费提供从天气查询.空气质量.地图坐标到金融 ...

  5. android-短信验证功能,Android实现获取短信验证码的功能以及自定义GUI短信验证详解...

    <Android实现获取短信验证码的功能以及自定义GUI短信验证详解>由会员分享,可在线阅读,更多相关<Android实现获取短信验证码的功能以及自定义GUI短信验证详解(8页珍藏版 ...

  6. SpringBoot + SpringSecurity 短信验证码登录功能实现

    实现原理 在之前的文章中,我们介绍了普通的帐号密码登录的方式:SpringBoot + Spring Security 基本使用及个性化登录配置(http://www.deiniu.com/artic ...

  7. android+自定义发彩信,Android实现获取短信验证码的功能以及自定义GUI短信验证

    短信验证功能大家都很熟悉了.在很多地方都能见到,注册新用户或者短息验证支付等.短信验证利用短信验证码来注册会员,大大降低了非法注册,很大程度上提高了用户账户的安全性. 目前市面上已经有了很多提供短信验 ...

  8. 一对一直播app源码实现短信验证码发送功能的详细步骤

    以前很多的一对一直播app源码,是通过用户注册时设置账号和密码进行登陆的,但是这样有非常明显的缺点,时间久了之后,很多用户会忘记账号或密码,找回的步骤也会比较繁琐.随着手机实名化的进行,越来越多的用户 ...

  9. 微信小程序 获取 手机验证码 短信验证码 后端功能实现解析

    本文原创首发CSDN,链接 https://mp.csdn.net/console/editor/html/106041472 ,作者博客https://blog.csdn.net/qq_414641 ...

最新文章

  1. iOS10 推送通知 UserNotifications
  2. php中int()强制转换,php下intval()和int强制转换使用的区别是什么
  3. IDEA阿里巴巴Java开发规约插件使用
  4. struts升级2.3.12到2.5.13
  5. Elasticsearch之如何合理分配索引分片
  6. java自定义对话框_Flutter AlertDialog自定义对话框实现示例(确认或取消)
  7. 使用Async同步执行异步函数
  8. sed教程入门与实例练习(一)
  9. apache http server 停止工作_宝塔apache启动失败:报错 AH00526: Syntax error on line 解决方案...
  10. 大数据之-Hadoop3.x_MapReduce_二次排序案例---大数据之hadoop3.x工作笔记0116
  11. 美国签证过不了,ICLR 2020搬到埃塞俄比亚,同性恋学者:不去,保命要紧
  12. Linux服务器间如何进行文件同步
  13. js实现form的submit请求
  14. 微软黑科技如何加速游戏开发,读这篇就够了
  15. 电信IoT平台对接及使用
  16. STC89C52单片机数码管介绍以及代码示例
  17. noj 1076 机器狗组装费用(优先队列)
  18. Hello AS400-Cobol
  19. 十三、SpringBoot与分布式
  20. 从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南

热门文章

  1. Redis——Lettuce连接redis集群
  2. 《分析一波NBA今年季后赛之听说东部今年格外牛?》
  3. 中华民族之拷问『天命』
  4. 【已解决】Exception in thread “main“ java.lang.IllegalArgumentExcept: illegal initialSize 6, maxActive 5
  5. 大话设计模式笔记(八)の模板方法模式
  6. Qt编写的RTSP播放器+视频监控(ffmpeg版本)
  7. 面对海量数据,如何才能查得更快?
  8. Unity 2D独立开发手记(五):通用任务系统
  9. PaddleHub创意项目-AI换发型
  10. 阿里技术高P访谈之“呆萌”程序员蒋晓伟为何从Facebook到阿里巴巴