編輯:關於Android編程
好久沒更新過博客了。這段時間總算是忙完了,抽點時間出來更新下博客。這次跟大家帶來的是一個很簡單的短信驗證碼。相信這個驗證碼的功能基本上99的項目都需要用到,我這裡是用的雲之迅平台,為什麼要用這個平台,因為原理很簡單,用起來也還不錯。
1、這裡說下雲之迅的實現原理,首先得去雲之迅平台去申請個開發者賬號,然後集成雲之迅代碼。
2、代碼原理其實也很簡單,就是自己在本地生成一個多少位的驗證碼,然後把驗證碼等參數通過雲之迅的接口發給雲之迅,再通過雲之迅給那台手機發送短信驗證碼,然後得到驗證碼之後輸入驗證碼,跟一開始生成的驗證碼進行對比,如果匹配的話就算是驗證通過,當然也可以本地md5加密,當前demo是沒有進行驗證碼加密的。
首先看下效果動圖(由於隱私問題把電話號碼擋住了一部分):


package com.wyw.smsdemo;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
// 確認按鈕
private Button btn_enter;
// 發送驗證碼
private Button btn_send_code;
// 驗證碼輸入框
private EditText edit_code;
// 手機號碼輸入框
private EditText edit_phone;
// 驗證碼
private String code;
/**
* 短信平台 Account sid
*/
public final static String SMS_SID = "";
/**
* 短信平台 Auth Token
*/
public final static String SMS_TOKEN = "";
/**
* 短信平台 SMS_APPID
*/
public final static String SMS_APPID = "";
/**
* 短信模板ID SMS_TEMPLATEID
*/
public final static String SMS_TEMPLATEID = "";
//計時器
private TimeCount timeCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_enter = (Button) findViewById(R.id.btn_enter);
btn_send_code = (Button) findViewById(R.id.btn_send_code);
edit_code = (EditText) findViewById(R.id.edit_code);
edit_phone = (EditText) findViewById(R.id.edit_phone);
btn_enter.setOnClickListener(this);
btn_send_code.setOnClickListener(this);
}
/**
* 內部類計時器
*/
private class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);// 參數依次為總時長,和計時的時間間隔
}
@Override
public void onFinish() {// 計時完畢時觸發
btn_send_code.setText("重新發送驗證碼");
btn_send_code.setEnabled(true);
}
@Override
public void onTick(long millisUntilFinished) {// 計時過程顯示
btn_send_code.setText((millisUntilFinished / 1000) + "後可重新發送驗證碼");
btn_send_code.setEnabled(false);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (timeCount!=null) {
timeCount.cancel();
}
}
@Override
public void onClick(View v) {
if (btn_enter == v) {//確認按鈕
String code_lin = edit_code.getText().toString();
if (TextUtils.isEmpty(code_lin)) {
Toast.makeText(MainActivity.this, "驗證碼不能為空", Toast.LENGTH_SHORT).show();
return;
}
if (code != null && code.equals(code_lin)) {
Toast.makeText(MainActivity.this, "驗證成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "驗證失敗,請填寫正確的驗證碼", Toast.LENGTH_SHORT).show();
}
} else if (btn_send_code == v) {//發送驗證碼
if (TextUtils.isEmpty(edit_phone.getText().toString())) {
Toast.makeText(MainActivity.this, "手機號碼不能為空", Toast.LENGTH_SHORT).show();
return ;
}
if (!isMobileNO(edit_phone.getText().toString())) {
Toast.makeText(MainActivity.this, "手機號碼不合法", Toast.LENGTH_SHORT).show();
return ;
}
sendSMS();
}
}
/**
* 驗證手機格式
*/
public static boolean isMobileNO(String mobiles) {
/*
移動:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
聯通:130、131、132、152、155、156、185、186
電信:133、153、180、189、177(1349衛通)
總結起來就是第一位必定為1,第二位必定為3或5或8,其他位置的可以為0-9
*/
String telRegex = "[1][134578]\\d{9}";//"[1]"代表第1位為數字1,"[358]"代表第二位可以為3、5、8中的一個,"\\d{9}"代表後面是可以是0~9的數字,有9位。
if (TextUtils.isEmpty(mobiles)) {
return false;
} else {
return mobiles.matches(telRegex);
}
}
/**
* 發送短信驗證碼
*/
private void sendSMS() {
code = Math.round(Math.random() * 10000) + "";
if (code.length() > 4) {
code = code.substring(0, 4);
} else if (code.length() < 4) {
sendSMS();
return;
}
new Thread(new Runnable() {
public void run() {
JsonReqClient client = new JsonReqClient();
String result = client.sendVerificationCode(SMS_APPID, SMS_SID,SMS_TOKEN, code, edit_phone.getText().toString(), SMS_TEMPLATEID);
//{"resp":{"respCode":"000000","templateSMS":{"createDate":"20140820145658","smsId":"d2c49329f363b802fb3531d9c67b54f8"}}}
if (result != null && result.length() > 0) {
try {
JSONObject object = new JSONObject(result);
if (object.has("resp")) {
JSONObject item = object.getJSONObject("resp");
//Code = 105122 同一天同一用戶不能發超過10條驗證碼(因運營商限制一般情況下不足5條)
if (item.has("respCode") && item.getString("respCode").equals("000000")) {
mHandler.sendEmptyMessage(0);
} else {
mHandler.sendEmptyMessage(1);
}
} else {
mHandler.sendEmptyMessage(1);
}
} catch (JSONException e) {
e.printStackTrace();
mHandler.sendEmptyMessage(1);
}
} else {
mHandler.sendEmptyMessage(1);
}
}
}).start();
}
private Handler mHandler = new Handler() {
@Override
public void dispatchMessage(Message msg) {
switch (msg.what) {
case 0:
Toast.makeText(MainActivity.this, "短信驗證碼發送成功", Toast.LENGTH_SHORT).show();
timeCount = new TimeCount(60000, 1000);
timeCount.start();
break;
case 1:
Toast.makeText(MainActivity.this, "短信驗證碼發送失敗", Toast.LENGTH_SHORT).show();
break;
}
}
};
}
/**
* 短信平台 Account sid
*/
public final static String SMS_SID = "";
/**
* 短信平台 Auth Token
*/
public final static String SMS_TOKEN = "";
/**
* 短信平台 SMS_APPID
*/
public final static String SMS_APPID = "";
/**
* 短信模板ID SMS_TEMPLATEID
*/
public final static String SMS_TEMPLATEID = "";




/**
* 發送短信驗證碼
*/
private void sendSMS() {
code = Math.round(Math.random() * 10000) + "";
if (code.length() > 4) {
code = code.substring(0, 4);
} else if (code.length() < 4) {
sendSMS();
return;
}
new Thread(new Runnable() {
public void run() {
JsonReqClient client = new JsonReqClient();
String result = client.sendVerificationCode(SMS_APPID, SMS_SID,SMS_TOKEN, code, edit_phone.getText().toString(), SMS_TEMPLATEID);
//{"resp":{"respCode":"000000","templateSMS":{"createDate":"20140820145658","smsId":"d2c49329f363b802fb3531d9c67b54f8"}}}
if (result != null && result.length() > 0) {
try {
JSONObject object = new JSONObject(result);
if (object.has("resp")) {
JSONObject item = object.getJSONObject("resp");
//Code = 105122 同一天同一用戶不能發超過10條驗證碼(因運營商限制一般情況下不足5條)
if (item.has("respCode") && item.getString("respCode").equals("000000")) {
mHandler.sendEmptyMessage(0);
} else {
mHandler.sendEmptyMessage(1);
}
} else {
mHandler.sendEmptyMessage(1);
}
} catch (JSONException e) {
e.printStackTrace();
mHandler.sendEmptyMessage(1);
}
} else {
mHandler.sendEmptyMessage(1);
}
}
}).start();
}
Android中Xposed框架篇---修改系統位置信息實現自身隱藏功能實例
一、前言本文主要來介紹一個實際案例就是如何通過這個框架來修改系統的地理位置信息來實現隱藏功能,在如今社交工具的發展特別是微信,他有一個實時位置共享功能,那麼對於那些不是單
Android中關於Adapter的使用(上)ArrayAdapter
在Android應用的開發中,ListView是最常用的一個列表顯示控件,微博,聯系人啊,反正只要涉及多數據展示的情況,都會用到ListView(另外就是GridView
Android 增量更新完全解析 是增量不是熱修復
一、概述最近一直關注熱修復的東西,偶爾聊天談到了增量更新,當然了兩個完全不是一個東西。借此找了一些資料,收集整理了一下,本來是不想寫博客的,因為主要都是工具的實現,但是昨
Android 高清加載巨圖方案 拒絕壓縮圖片
一、概述距離上一篇博客有段時間沒更新了,主要是最近有些私事導致的,那麼就先來一篇簡單一點的博客脈動回來。對於加載圖片,大家都不陌生,一般為了盡可能避免OOM都