獲取短信驗證碼自動填寫并驗證
來自: 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!