獲取短信驗證碼自動填寫并驗證
來自: http://my.oschina.net/u/2600948/blog/607002
@SuppressLint({"ShowToast", "HandlerLeak"})
public class RecordActy extends Activity implements OnClickListener {
private Button getCodebtn; //獲取驗證碼
private EditText codeET; //驗證碼輸入框
private EditText phoneET; //電話號碼
private Button submitbtn; //提交按鈕
private ImageView backIV; //返回按鈕
private Context context;
private int i = 60; //倒計時數
private boolean flag = true;
private SmsContent content;
/*
* 處理驗證碼信息
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == -1) {
getCodebtn.setText(i + "秒");
} else if (msg.what == -2) {
getCodebtn.setText("驗證碼");
getCodebtn.setClickable(true);
} else {
int event = msg.arg1;
int result = msg.arg2;
Object data = msg.obj;
if (result == SMSSDK.RESULT_COMPLETE) {
if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
new Thread(new Runnable() {
@Override
public void run() {
phoneNum = phoneET.getText().toString();
finish();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
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) {
Toast.makeText(getApplicationContext(),
"驗證錯誤", Toast.LENGTH_SHORT).show();
} else {
((Throwable) data).printStackTrace();
}
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acty_submit);
SwipeBackLayout mSwipeBackLayout = getSwipeBackLayout();
mSwipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_LEFT);
// 初始化界面
initView();
// 初始化短信驗證SDK
initSMS();
// initObserver();
}
private void initObserver() {
content = new SmsContent(new Handler());
// 注冊短信監聽變化
this.getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, content);
}
private void initView() {
context = this;
findViews();
setSpnAdapter();
setListener();
}
private void setListener() {
getCodebtn.setOnClickListener(this);
submitbtn.setOnClickListener(this);
}
private void findViews() {
getCodebtn = (Button) findViewById(R.id.as_btn_getCode);
codeET = (EditText) findViewById(R.id.as_et_code);
phoneET = (EditText) findViewById(R.id.as_et_phoneNum);
submitbtn = (Button) findViewById(R.id.as_btn_submit);
phoneET.setOnTouchListener(new OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
phoneET.setFocusable(false);
}
return false;
}
});
}
private void initSMS() {
// 啟動短信驗證sdk
SMSSDK.initSDK(RecordActy.this, "此處填寫獲得的驗證碼",
"此處填寫獲得的驗證碼");
EventHandler eventHandler = new EventHandler() {
@Override
public 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(eventHandler);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.as_btn_getCode:// 活取驗證碼
phoneNum = phoneET.getText().toString();
// 判斷手機號是否合法
if (!judgephoneNum(phoneNum)) {
return;
}
// 發送短信
SMSSDK.getVerificationCode("86", phoneNum);
// 開啟線程循環
getCodebtn.setClickable(false);
getCodebtn.setText(i + "秒");
new Thread(new Runnable() {
@Override
public void run() {
for (i = 60; i > 0; i--) {
handler.sendEmptyMessage(-1);
if (i <= 0) {
break;
}
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
Looper.prepare();
handler.sendEmptyMessage(-2);
}
}).start();
break;
case R.id.as_btn_submit:
new Thread(new Runnable() {
@Override
public void run() {
String code = codeET.getText().toString();
SMSSDK.submitVerificationCode("86", phoneNum, code);
flag = false;
}
}).start();
break;
case R.id.as_iv_back:
finish();
break;
default:
break;
}
}
private boolean judgephoneNum(String phoneNum) {
if (isMathLength(phoneNum, 11) && isMobilNO(phoneNum)) {
return true;
}
Toast.makeText(getApplicationContext(), "請輸入正確的手機號碼", Toast.LENGTH_SHORT).show();
return false;
}
private boolean isMobilNO(String phoneNum) {
String telRegex = "[1][358]\\d{9}";// "[1]"代表第1位為數字1,"[358]"代表第二位可以為3、5、8中的一個,"\\d{9}"代表后面是可以是0~9的數字,有9位。
if (TextUtils.isEmpty(phoneNum))
return false;
else
return phoneNum.matches(telRegex);
}
@SuppressLint("NewApi")
private boolean isMathLength(String phoneNum, int i) {
if (phoneNum.isEmpty()) {
return false;
} else {
return phoneNum.length() == i ? true : false;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
}
return super.onKeyDown(keyCode, event);
}
public class SmsContent extends ContentObserver {
private Cursor cursor = null;
public SmsContent(Handler handler) {
super(handler);
}
@SuppressWarnings("deprecation")
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 讀取收件箱中指定號碼的短信
cursor = managedQuery(Uri.parse("content://sms//inbox"),
new String[]{"_id", "address", "read", "body"},
" address=? and read=?",
new String[]{"你要監聽的號碼", "0"}, "_id desc");// 按id排序,如果按date排序的話,修改手機時間后,讀取的短信就不準了
Log.e("", "cursor.isBeforeFirst() " + cursor.isBeforeFirst()
+ " cursor.getCount() " + cursor.getCount());
if (cursor != null && cursor.getCount() > 0) {
ContentValues values = new ContentValues();
values.put("read", 1); // 修改為已讀
cursor.moveToNext();
int smsbodyColumn = cursor.getColumnIndex("body");
String smsBody = cursor.getString(smsbodyColumn);
Log.e("smsBody= ", smsBody);
codeET.setText(Utils.getDynamicPassword(smsBody));
}
// 在用managedQuery的時候,不能主動調用close()方法,否則在Android 4.0+的系統上,會發生崩潰
if (Build.VERSION.SDK_INT < 14) {
cursor.close();
}
}
}
@Override
protected void onDestroy() {
this.getContentResolver().unregisterContentObserver(content);
super.onDestroy();
}
}
Utils中的截取短信的功能
/**
* 從字符串中截取連續4位數字
* 用于從短信中獲取動態密碼
*
* @param str 短信內容
* @return 截取得到的4位動態密碼
*/
public static String getDynamicPassword(String str) {
Pattern continuousNumberPattern = Pattern.compile("[0-9\\.]+");
Matcher m = continuousNumberPattern.matcher(str);
String dynamicPassword = "";
while (m.find()) {
if (m.group().length() == 4) {
System.out.print(m.group());
dynamicPassword = m.group();
}
}
return dynamicPassword;
}
最后不要忘了添加權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" />
布局我就不貼了挺簡單的,自己寫吧!
本文由用戶 bbpg6219 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!