最近一段时间工作上面事情比较少,就开始学习一点东西,也很长时间没有写博客,所以还是记录一下,方便自己以后需要使用的时候查找,也提供给需要的人。

开始正文

我们经常在一个app注册的时候需要使用到短信验证码,输入一个手机号码,点击获取验证码,手机就能收到一条短信,输入短信中的验证码就能验证成功进而进行一些操作。

当然现在提供短信服务的也有很多,我们选择一个免费的sdk平台Mob,如果有问题还可以咨询技术支持,服务还挺好的。但是因为是免费的,所以还是有一些限制吧,如果是作为测试的话,一个手机号码最多只能收到不到10次验证码,超过10次就不发送了,这时你就要换一个手机号码去接收验证码。

官网地址: http://www.mob.com/#/  该平台还提供其他的一些服务,有需要的可以挖掘。

当然你还是要注册一个账户,然后申请一个app,获取到app key 和app  secret, 这个在你的项目里面需要用到,如图中的SecurityCodeSDK

然后下载sdk。下图就是Android sdk下载的页面, 可以看到我们可以根据IDE选择不同的sdk,我下载的就是Android studio的sdk,

下载完成之后解压出来,可以获取到如下的四个jar包, 还有一个txt文件, txt文件是添加sdk到工程的方法。

先把这四个jar包拷贝到项目的libs文件夹下,然后在gradle文件中添加如下红色部分

apply plugin: 'com.android.application'

android {compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {        minSdkVersion 23
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }buildTypes {release {minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }}
}repositories {flatDir{dirs 'libs'}
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations'
    })compile 'com.android.support:appcompat-v7:25.0.0'
    compile name:'SMSSDK-2.1.2',ext:'aar'compile name:'SMSSDKGUI-2.1.2',ext:'aar'
    testCompile 'junit:junit:4.12'
}

然后还要在AndroidManifest.xml文件中添加如下的activity:

<activityandroid:name="com.mob.tools.MobUIShell"android:configChanges="keyboardHidden|orientation|screenSize"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:windowSoftInputMode="stateHidden|adjustResize"/>

布局文件很简单,就两个textiew和两个button,下面贴上主代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "SmsYanzheng";EditText mEditTextPhoneNumber;EditText mEditTextCode;Button mButtonGetCode;Button mButtonLogin;EventHandler eventHandler;String strPhoneNumber;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mEditTextPhoneNumber = (EditText) findViewById(R.id.phone_number);mEditTextCode = (EditText) findViewById(R.id.verification_code);mButtonGetCode = (Button) findViewById(R.id.button_send_verification_code);mButtonLogin = (Button) findViewById(R.id.button_login);mButtonGetCode.setOnClickListener(this);mButtonLogin.setOnClickListener(this);SMSSDK.initSDK(this, "app key", "app secret"); //使用你申请的key 和 secreteventHandler = new EventHandler() {/*** 在操作之后被触发** @param event  参数1* @param result 参数2 SMSSDK.RESULT_COMPLETE表示操作成功,为SMSSDK.RESULT_ERROR表示操作失败* @param data   事件操作的结果*/@Overridepublic void afterEvent(int event, int result, Object data) {Message message = myHandler.obtainMessage(0x00);message.arg1 = event;message.arg2 = result;message.obj = data;myHandler.sendMessage(message);}};SMSSDK.registerEventHandler(eventHandler);}@Overrideprotected void onDestroy() {super.onDestroy();SMSSDK.unregisterEventHandler(eventHandler);}@Overridepublic void onClick(View view) {if (view.getId() == R.id.button_login) {String strCode = mEditTextCode.getText().toString();if (null != strCode && strCode.length() == 4) {Log.d(TAG, mEditTextCode.getText().toString());SMSSDK.submitVerificationCode("86", strPhoneNumber, mEditTextCode.getText().toString());} else {Toast.makeText(this, "密码长度不正确", Toast.LENGTH_SHORT).show();}} else if (view.getId() == R.id.button_send_verification_code) {strPhoneNumber = mEditTextPhoneNumber.getText().toString();if (null == strPhoneNumber || "".equals(strPhoneNumber) || strPhoneNumber.length() != 11) {Toast.makeText(this, "电话号码输入有误", Toast.LENGTH_SHORT).show();return;}SMSSDK.getVerificationCode("86", strPhoneNumber);mButtonGetCode.setClickable(false);//开启线程去更新button的textnew Thread() {@Overridepublic void run() {int totalTime = 60;for (int i = 0; i < totalTime; i++) {Message message = myHandler.obtainMessage(0x01);message.arg1 = totalTime - i;myHandler.sendMessage(message);try {sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}myHandler.sendEmptyMessage(0x02);}}.start();}}Handler myHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0x00:int event = msg.arg1;int result = msg.arg2;Object data = msg.obj;Log.e(TAG, "result : " + result + ", event: " + event + ", data : " + data);if (result == SMSSDK.RESULT_COMPLETE) { //回调  当返回的结果是completeif (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //获取验证码Toast.makeText(MainActivity.this, "发送验证码成功", Toast.LENGTH_SHORT).show();Log.d(TAG, "get verification code successful.");} else if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交验证码Log.d(TAG, "submit code successful");Toast.makeText(MainActivity.this, "提交验证码成功", Toast.LENGTH_SHORT).show();Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);} else {Log.d(TAG, data.toString());}} else { //进行操作出错,通过下面的信息区分析错误原因try {Throwable throwable = (Throwable) data;throwable.printStackTrace();JSONObject object = new JSONObject(throwable.getMessage());String des = object.optString("detail");//错误描述int status = object.optInt("status");//错误代码//错误代码:  http://wiki.mob.com/android-api-%E9%94%99%E8%AF%AF%E7%A0%81%E5%8F%82%E8%80%83/Log.e(TAG, "status: " + status + ", detail: " + des);if (status > 0 && !TextUtils.isEmpty(des)) {Toast.makeText(MainActivity.this, des, Toast.LENGTH_SHORT).show();return;}} catch (Exception e) {e.printStackTrace();}}break;case 0x01:mButtonGetCode.setText("重新发送(" + msg.arg1 + ")");break;case 0x02:mButtonGetCode.setText("获取验证码");mButtonGetCode.setClickable(true);break;}}};
}

当然还需要在AndroidManifest文件中声明权限:

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.RECEIVE_SMS"/><uses-permission android:name="android.permission.READ_SMS"/><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><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.GET_TASKS"/>

现在就可以测试手机能不能获取到验证码了,当然,前提是需要手机能访问网络。

还有详细的方法的用法和指导,可以直接区mob官网自行查询。

代码下载:github

Android 调用免费短信验证码sdk开发相关推荐

  1. 免费短信验证码SDK是一款由移动开发服务平台Mob(前身ShareSDK)正式推出“全球短信验证码解决方案”

    免费短信验证码SDK是一款由移动开发服务平台Mob(前身ShareSDK)正式推出"全球短信验证码解决方案",正式面向开发者免费开放.方案是为开发者提供全球通用短信验证码工具,开发 ...

  2. Android基于环信SDK开发IM即时聊天(一)

    2016-09-02更新:可以看一下最新的这篇文章和源码,Android基于环信SDK开发IM即时聊天(二) 目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即 ...

  3. Android基于环信SDK开发IM即时聊天(二)

    声明1:北京时间现在是2019/6/10,评论里的问题我看到了,这几天我找时间看看源代码问题出在哪,在此感谢大家的监督 声明2:此Demo我是在5.1测试机上测试通过,感谢WTQ_DOMIAN的评论, ...

  4. Android 调用百度地图sdk 实现路线规划导航

    Android 调用百度地图sdk 实现路线规划导航 功能: 实现实时/需求定位 卫星地图查看 路况 周边poi检索 地点输入提示检索 驾驶 步行 公交 骑行路线规划 注:以上为实现的大概功能 ,接下 ...

  5. Android开发免费短信验证码SDK。

    本人也是刚入安卓,今天学到了短信验证这一块.在平时我们接触的很多APP注册(登录)都需要短信验证,所以突然就想到写一篇博客,一来是巩固知识,方便自己查阅.二来是和大家伙们一起分享下,给需要的朋友一点自 ...

  6. Android原生整合虹软SDK开发uniapp插件

    1.项目背景 应公司要求,需要开发一套类似人脸打卡功能的app,但是因为我们公司没有很强的原生android开发者,所以根据现状选择了第三方跨平台的uniapp,想必目前大多人都了解这个平台了,我也就 ...

  7. android 第三方 im,Android基于环信SDK开发IM即时聊天

    目前市面上我了解的做第三方即时聊天SDK的有两家:环信.融云,这里我使用环信SDK来完成即时聊天的初步开发工作. 下面先奉上1张效果图: 1.开发准备 首先要到环信官网注册开发者账号,目前只有企业账号 ...

  8. 环信sdk android 聊天,Android基于环信SDK开发IM即时聊天

    根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的GeoPoint,根据这4个点,通过mys 目前市面上我了解的做第三方即时聊天S ...

  9. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

  10. Android/iOS视频编辑SDK开发记

    开发移动端的视频编辑SDK已经三个月了,因为之前有过在PC上做实时视频合成的经验,所以乐观预期最短两个月就够了,因为主要的开发难点只在于Android和iOS移动平台相关的模块,以及视频合成的时间线控 ...

最新文章

  1. es获取最大时间的记录_ES查询一段时间内某一循环时间段的数据
  2. 盘点丨2017年亚洲新晋18家独角兽公司
  3. 爬虫采集-基于webkit核心的客户端Ghost.py [爬虫实例]
  4. 图像添加柯西分布噪声
  5. Google发布新API,支持训练更小、更快的AI模型
  6. 如何选择国外虚拟主机空间服务商
  7. l360清零软件无响应_张店楼顶商业广告全面“清零”!城市“天际线”颜值再刷新...
  8. 程序员面试强行用代码画画被骂,20分钟后面试官闭嘴了
  9. DXUT实战1:CG+D3D9+DXUT(june_2010)
  10. 如何理解和应用Java的多态
  11. c++ 按行读取txt文件并赋值_C 语言入门 19 读取txt文件中的数字,消除其中连续重复的数字...
  12. 如何通过iPad云编译C语言,在iOS(iphone、ipad)上编辑、编译和运行c/c++(包括iPhone6和iOS8)...
  13. 百度离线地图-Vue
  14. 《缠中说禅108课》59:图解分析示范四
  15. Android:LayoutInflater(布局服务)的 简单介绍 使用方法解析
  16. SnowNLP包情感分析
  17. 百度AI市场热品试用 | 视派尔近红外活体识别双目摄像头模组
  18. 社群运营,做好社群长期活跃可以从哪些方面入手?
  19. 20210223-21款Mac Pro M1安装ps和pr,个人实践有用,不需要付费,自己踩过的坑
  20. 简洁的python复习(原创基础上有部分改动,持续更新)

热门文章

  1. NI-9253 C系列电流输入模块-9253
  2. 龙格库塔算法原理详解
  3. python 打开pdf显示在页面_C# WinForm打开PDF文件并在窗体中显示
  4. 常用照片尺寸对照表,照片大小看这个表就对了
  5. 怎么减少pdf文件的大小?如何降低pdf文件的大小?
  6. R语言ggplot2可视化:使用ggpubr包的ggboxplot函数可视化分组箱图、使用ggpar函数改变图形化参数(palette、修改可视化图像边框色为灰色渐变配色方案)
  7. 计算机组装配置兼容,电脑组装时怎么选择配置主板
  8. Android WebView 无法下载文件的问题
  9. gabor滤波器matlab实现,使用matlab实现Gabor滤波器
  10. CAD插件的安装和自动加载dll、arx