如何获取短信验证码格式不正确码

Android获取和读取短信验证码的实现方法_Android
现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注册.简单的介绍一下吧.
Android获取短信验证码还是比较简单的,通过Mob官网提供的ShareSDK,调用其中内部的方法,就可以获取到短信的验证码了.提供一下Mob的官网地址.http://www.mob.com/#/在官网上注册相关的信息之后,下载相关的jar包和.so文件就可以实现获取短信验证码了(2.0之前的版本都需要下载jar包和 .so文件,而现在的2.2版本已经不需要下载.so文件了,通过加载SMSSDK.jar,MobCommons.jar,MobTools.jar包就可以直接使用).如何注册我就不解释了.
最后注册完的样式就是这样的..我们来看看具体实现..
1.如何获取短信验证码.
i.首先需要初始化SDK,第三方这些东西首先必须要有的操作就是初始化SDK.一般都在OnCreate()函数中来完成.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SMSSDK.initSDK(this, AppKey, APPSECRET);
EventHandler eh = new EventHandler() {
public void afterEvent(int event, int result, Object data) {
Message msg = new Message();
msg.arg1 =
msg.arg2 =
handler.sendMessage(msg);
SMSSDK.registerEventHandler(eh);
这个是必须要进行的操作,否则后续的东西都将无法完成.initSDK(Context context,String AppKey,String AppSECRET),初始化需要传递Context对象,以及我们申请的Key和SECRET.并且这里定义了一个EventHandler,用来进行验证的时候将一些消息提供给主线程的Handler,让主线程来做一些相关的操作来通知用户验证的情况到底如何.
ii.调用SMSSDK.getVerificationCode(String,String)方法
初始化SDK之后,我们就可以通过使用getVerificationCode()方法来获取我们的验证码了.
* @param string 电话号码的区号 比如说86
* @param string 具体的电话号码
SMSSDK.getVerificationCode("86", PhoneEd.getText().toString());
我们在调用方法的时候,需要传递我们手机号码的区号和具体的手机号码.由于中国国内是86开头.因此传递的区号就是86,在加上自己的电话号码就可以通过网络调用方法来获取相关的验证码了.
iii.验证我们输入的验证码和发送过来的验证码是一致的.
当验证码发送过来的时候,客户端一般就需要进行输入,但是这里需要一个验证的过程,判断当前用户输入的验证码和发送过来的验证码是否一致.
SMSSDK.submitVerificationCode("86", phone, CodeEd.getText().toString());
验证的方式通过调用submitVerificationCode()方法来完成.需要传递区号,电话号码,以及我们输入的验证码的数值.验证的过程由ShareSDK帮我们完成.因此就不需要执行太多复杂的操作.当我们传递的数值和发送过来的数值是一样的,那么就会验证成功,否则就会验证失败.
这样在我们的客户端软件上就可以通过这种验证方式来完成注册功能.当验证成功后,就可以进入新的界面,如果验证失败,那么就需要确认输入的验证码.这样就能够完成应用程序的验证码验证.
一般情况下,我们只需要通过查看短信,然后提交相关的验证码就可以了,但是还有一些其他的应用更加的人性化,当验证码信息发送到手机内部的时候直接就能够获取到相关的验证码,然后直接添加在需要验证的地方,这样非常的方便,并且还能防止用户输入错误.那么这就涉及到读取短信的相关内容了.
iv.添加相关的权限
&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" /&
那么如何获取短信的相关内容呢?
2.如何获取刚收到的短信的相关内容.
一般而言,短信的验证是以新短信的方式直接发送给用户的,那么应用程序如果想到读取刚收到的短息内容,就需要有相关的监听事件.我通过使用ContentObserver来实现的.通过使用这个类可以捕捉特定的uri使数据库改变,然后进而作一些相关的处理.
那么我们就可以这样去实现,通过继承ContentObserver类,重写内部的onChange方法,设置特定的Uri,使得我们的类能够监听短信数据发生了变化这样我们的应用程序就知道什么时候短信到来了.那么短信到来之后,我们通过对短信内容的获取,然后读取内容中的验证码信息就可以了.
private class SmsObserver extends ContentObserver {
public SmsObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
*Uri.parse("content://sms/inbox")表示对收到的短信的一个监听的uri.
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
Cursor cursor = getContentResolver().query(
Uri.parse("content://sms/inbox"), null, null, null, null);
//这里不要使用while循环.我们只需要获取当前发送过来的短信数据就可以了.
cursor.moveToNext();
sb.append("body=" + cursor.getString(cursor.getColumnIndex("body"))); //获取短信内容的实体数据.
Pattern pattern = Pattern.compile("[^0-9]"); //正则表达式.
Matcher matcher = pattern.matcher(sb.toString());
CodeText = matcher.replaceAll("");
CodeEd.setText(CodeText); //将输入验证码的控件内容进行改变.
cursor.close(); //关闭游标指针.
super.onChange(selfChange);
实现类的方式如上,通过重写OnChange方法来进行后续的操作,这里的cursor可以对当前的短信数据库中的数据进行查找,这里的cursor指针不要使用while循环,因为验证码这条短信是随发即用的,我们也只需要获取当前发送过来的验证码短信中的相关内容,如果cursor使用了while循环,那么将会读取短信中的所有内容.这并不是我们想要的.
当我们获取到了短信的具体内容之后,我们可以通过使用正则表达式,去匹配短信内容的数字,然后就能够获取到验证码数据了.大体的思路就是这样一个情况.同时我们需要添加相关用户权限.
&uses-permission android:name="android.permission.RECEIVE_SMS" /&
&uses-permission android:name="android.permission.READ_SMS" /&
完成了上面的步骤之后,我们需要获取ContentResolver实例,然后注册ContentObserver。
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new SmsObserver(new Handler()));
注册我们需要传递相关的uri,第二个参数决定匹配uri的方式,如果设置为true的话,那么表示不精确匹配,那么也就表示,如果是一类的uri,那么都会被匹配到,如果设置为false,那么也就只能匹配到我们传递进去的uri,也就是所谓的精确匹配.最后一个对象需要传递一个子类的实例,并且需要传递Handler对象.这样我们也就可以在这个方法里去更新ui了.
当我们不需要使用ContentObserver的时候,我们只需要注销注册就可以了.
相对而言,验证码信息一般都是内容比较少的,如果内容比较复杂,然后还有其他额外的数字信息,那么我们在使用正则表达式的时候同时需要进行相关的优化.
最后上一个源代码:
package com.example.
import java.util.regex.M
import java.util.regex.P
import org.json.JSONO
import cn.smssdk.EventH
import cn.smssdk.SMSSDK;
import cn.smssdk.utils.SMSL
import android.app.A
import android.database.ContentO
import android.database.C
import android.net.U
import android.os.B
import android.os.H
import android.os.M
import android.text.TextU
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.T
public class MainActivity extends Activity implements OnClickListener {
private Button getC
private Button I
private EditText PhoneEd;
private EditText CodeEd;
private String AppKey = "110ee66f30b40";
private String APPSECRET = "85ec67aed1b89e3ec73f37b8b89f5142";
private String CodeT
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
int event = msg.arg1;
int result = msg.arg2;
Object data = msg.
if (result == SMSSDK.RESULT_COMPLETE) {
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
Toast.makeText(getApplicationContext(), "提交验证码成功",
Toast.LENGTH_SHORT).show();
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 已经验证
Toast.makeText(getApplicationContext(), "验证码已经发送",
Toast.LENGTH_SHORT).show();
int status = 0;
((Throwable) data).printStackTrace();
Throwable throwable = (Throwable)
JSONObject object = new JSONObject(throwable.getMessage());
String des = object.optString("detail");
status = object.optInt("status");
if (!TextUtils.isEmpty(des)) {
Toast.makeText(MainActivity.this, des,
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
SMSLog.getInstance().w(e);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SMSSDK.initSDK(this, AppKey, APPSECRET);
EventHandler eh = new EventHandler() {
public void afterEvent(int event, int result, Object data) {
Message msg = new Message();
msg.arg1 =
msg.arg2 =
handler.sendMessage(msg);
SMSSDK.registerEventHandler(eh);
private void init() {
getCode = (Button) findViewById(R.id.getCode);
Identity = (Button) findViewById(R.id.Indentity);
PhoneEd = (EditText) findViewById(R.id.PhoneEd);
CodeEd = (EditText) findViewById(R.id.Code);
getCode.setOnClickListener(this);
Identity.setOnClickListener(this);
private class SmsObserver extends ContentObserver {
public SmsObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
Cursor cursor = getContentResolver().query(
Uri.parse("content://sms/inbox"), null, null, null, null);
cursor.moveToNext();
sb.append("body=" + cursor.getString(cursor.getColumnIndex("body")));
System.out.println(sb.toString());
Pattern pattern = Pattern.compile("[^0-9]");
Matcher matcher = pattern.matcher(sb.toString());
CodeText = matcher.replaceAll("");
CodeEd.setText(CodeText);
cursor.close();
super.onChange(selfChange);
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.getCode: // 获取验证码的过程.
if (!TextUtils.isEmpty(PhoneEd.getText().toString())) {
getContentResolver().registerContentObserver(
Uri.parse("content://sms"), true,
new SmsObserver(new Handler()));
SMSSDK.getVerificationCode("86", PhoneEd.getText().toString());
phone = PhoneEd.getText().toString();
Toast.makeText(MainActivity.this, "电话号码不能为空", Toast.LENGTH_LONG)
case R.id.Indentity:
SMSSDK.submitVerificationCode("86", phone, CodeEd.getText()
.toString());
protected void onDestroy() {
SMSSDK.unregisterAllEventHandler();
getContentResolver().unregisterContentObserver(new SmsObserver(handler));
这样就能够完成一个简单的通过使用短信验证码的方式来实现验证,在一般的项目中,我们可以根据具体的需求进行相关的改良,总之万变不离其宗思路基本都是一样的.当然在判断是否有短信到来也可以使用BroadCaseReceiver来实现,不过我看了网上的一些相关的资源,自己也试了一下,没有实现出来.感觉没有ContentObserver这么简单方便.
源码下载:Android获取和读取短信验证码
以上就是Android获取和读取短信验证码的实现方法,希望对大家学习Android软件编程有所帮助。&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
自动获取短信验证码
摘要:1.自定义监听类/***&短信监听器,用于自动填充验证码*/public&class&SMSContentObserver&extends&ContentObserver&{public&final&String&SMS_URI_INBOX&=&&content://sms/inbox&;//收信箱private&Activity&nbs
1.自定义监听类
/** *&短信监听器,用于自动填充验证码*/public&class&SMSContentObserver&extends&ContentObserver&{ public&final&String&SMS_URI_INBOX&=&&content://sms/inbox&;//收信箱 private&Activity&activity&=& private&String&smsContent&=&&&;//验证码 private&EditText&verifyText&=&//验证码编辑框 private&String&SMS_ADDRESS_PRNUMBER&=&&89&;//短息发送提供商 private&String&smsID&=&&&; //短信观察者&收到一条短信时&onchange方法会执行两次,所以比较短信id,如果一致则不处理 public&SMSContentObserver(Activity&activity,&Handler&handler,&EditText&verifyText)&{
super(handler);
this.activity&=&
this.verifyText&=&verifyT } @Override public&void&onChange(boolean&selfChange)&{
super.onChange(selfChange);
Cursor&cursor&=&//&光标
//&读取收件箱中指定号码的短信
cursor&=&activity.getContentResolver().query(Uri.parse(SMS_URI_INBOX),new&String[]{&_id&,&&address&,&&body&,&&read&},&//要读取的属性&address=?&and&read=?&,&//查询条件是什么new&String[]{SMS_ADDRESS_PRNUMBER,&&0&},//查询条件赋值&date&desc&);//排序
if&(cursor&!=&null)&{cursor.moveToFirst();if&(cursor.moveToFirst())&{ //比较和上次接收到短信的ID是否相等 if&(!smsID.equals(cursor.getString(cursor.getColumnIndex(&_id&))))&{
String&smsbody&=&cursor.getString(cursor.getColumnIndex(&body&));
//用正则表达式匹配验证码
Pattern&pattern&=&Pattern.compile(&[0-9]{6}&);
Matcher&matcher&=&pattern.matcher(smsbody);
if&(matcher.find())&{//匹配到6位的验证码smsContent&=&matcher.group();if&(verifyText&!=&null&&;&;&null&!=&smsContent&&;&;&!&&.equals(smsContent))&{ verifyText.requestFocus();//获取焦点 verifyText.setText(smsContent);//设置文本 verifyText.setSelection(smsContent.length());//设置光标位置}
smsID&=&cursor.getString(cursor.getColumnIndex(&_id&)); }}
2.在登录页面事件化监听类
//实例化短信监听器SMSContentObserver&mObserver&=&new&SMSContentObserver(getActivity(),&new&Handler(),&mEt_auth_code);//&注册短信变化监听mContext.getContentResolver().registerContentObserver(Uri.parse(&content://sms/&),&true,&mObserver);
3.声明读取短信权限
&uses-permission&android:name=&android.permission.RECEIVE_SMS&&/&&uses-permission&android:name=&android.permission.READ_SMS&&/&&uses-permission&android:name=&android.permission.WRITE_SMS&&/&
4.为了防止内存泄漏,记得注销监听
@Overridepublic&void&onDestroy()&{super.onDestroy();
//注销短信监听&&&&&
mContext.getContentResolver().unregisterContentObserver(mObserver);}
去短信库获取短信比较不容易被拦截
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
自动获取短信验证码相关信息,包括
的信息,所有自动获取短信验证码相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International一级建造师注册怎么获取短信验证码
,内容来自筑龙网相关的培训课程、论坛帖子、行业资讯等。筑龙网为国内最权威最专业的建筑工程学习。交流平台,超过1000万设计师、工程师和造价师在筑龙网交流、学习更多相关资料请访问日更新500篇的!(发布于:日)
此时有人在和您一起浏览筑龙优搜库
一级建造师注册怎么获取短信验证码相关专题推荐手机号免费获取验证码
<div class="mod_pages none" r-component="paging" r-class="{none: pages
<a href="javascript:;" class="page_prev" r-class="{disabled: cur 上一页
<div class="mod_pages none" r-component="paging" r-class="{none: pages
<a href="javascript:;" class="page_prev" r-class="{disabled: cur 上一页
将要为你跳转到
《{delKeyword(title)}》{delKeyword(playSrcName)}网付费片源}

我要回帖

更多关于 虚拟手机获取验证码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信