簡訊驗證

By | 2016-10-17

 

註冊會員帳號有幾種驗證方式,一般而言最常見註冊方式為帳號密碼,Hank老師曾介紹過使用Firebase的Email註冊,當然,Firebase還支援了其他好用的整合登入/註冊,包括Facebook、Google Account、Email、…….. 等。今天要來介紹另一種常見的會員驗證方式 — 簡訊驗證,簡訊驗證主要目的為驗證使用者所輸入手機號碼是否屬實,多用在一機一帳號的APP上,例如Line、WeChat。

第三方類別庫ButterKnife使用方法,請參考使用第三方類別庫 ButterKnife 及外掛套件加速開發
Android 授權請參考Android 6.0的Permission權限設計
ConstraintLayout請參考打鐵趁熱,使用ConstraintLayout設計登入畫面
SQLite Query請參考Android高效入門—SQLite資料庫
本例使用 Android Studio 2.2.1。

一、處理畫面 

1. 新增專案 smsVerify
開啟activity_main.xml切換為Design模式,在畫面空白處按滑鼠右鍵,將RelativeLayout切換為ConstraintLayout。
mag_sms_verify

3. 將元件分別拉至畫面中,並設定屬性。

此步驟請有點耐心,初使用ConstraintLayout會不太習慣,多拉兩個畫面後,會愈來愈順手,小編使用Autoconnect。
mag_sms_verify_02

完成畫面如下:
( 畫面設計非本文重點,若尚不順手,可先使用原習慣Layout及元件設計畫面 )
mag_sms_verify_01

執行如下:

mag_sms_verify_device_01 mag_sms_verify_device_02 mag_sms_verify_device_05

發現了嗎?輸入鍵盤不會擋到正在輸入的欄位,使用ConstraintLayout不需額外設定。

二、送出簡訊驗證碼並收取簡訊驗證

按下Button btnSendCode後,送出簡訊驗證碼。實務應用上,[傳送簡訊驗證碼]和[驗證]兩個動作會將資訊提交給Server,交由Server處理[傳送簡訊]和[檢查驗證碼]的動作。

1. 取得權限

在此,我們簡化作業,直接從自己的手機傳送簡訊驗證碼,故要先取得傳送和讀取簡訊的權限。

  • 第 5 行:檢查手機號碼是否空白。
  • 第 6 – 11 行:要求權限。
  • 第 13 行:已授權過,傳送簡訊。

  • 第 5 – 7 行:檢查是否取得讀取簡訊和傳送簡訊授權。
  • 第 8 行:傳送簡訊

  • 第 3 – 9 行:發送簡訊,內容(即簡訊驗證碼)為“456799″。

2. 監看簡訊內容

簡訊送出後,我們要透過程式攔截簡訊,想得知是否收到簡訊有兩種方法,本文採用ContentObserver(內容觀察者)。ContentObserver是做為APP間交換資料時很重要的一個API,若說Event Listener是監聽事件(元件的動作),那麼ContentObserver就是監聽資料庫的變化,但,可不是所有資料庫都能監聽的到,必須已實作ContentProvider的程式才能提供給外部程式透過ContentObserver監聽資料庫的變化。

例如本例,收到簡訊後,負責接收簡訊的程式會將簡訊資料寫入資料庫,我們的APP希望能即時監聽到資料的變化,簡訊程式必需實作ContentProvider,我們的APP才能透過ContentObserver得知是否已收到新的簡訊。

現在先準備一個ContentObserver,新增Java Class SMSContentObserver 繼承 ContentObserver,然後複寫onChange(),監聽到資料的變化所要處理的程式寫在onChange()內,這樣就準備好了一個空的ContentObserver。

3. 註冊/反註冊ContentObserver

怎麼知道要監聽哪一個Content呢?請切換到MainActivity.java。

  • 第 4 行:Telephony.Sms.CONTENT_URI即為簡訊程式提供給外部程式使用的Uri。
  • 第 5 行:先將SMSContentObserver new出來,參數 handler後面會介紹。
  • 第 6 行:註冊內容觀察者smsContentObserver,至於這個觀察者所要觀察的內容(監聽的資料)則是uri。
  • 第 10 行:不再監聽資料時,反註冊smsContentObserver。

當簡訊送出後,要開始監看簡訊資料。在smsSend()最後一行加上registerContentObservers();

收到簡訊後要做什麼事呢?

4. 收到簡訊

我們希望將簡訊內容貼到驗證碼欄位,再傳送到伺服器驗證,呃 ……  當然是假裝自己是SERVER,自己驗證 XD。

請切換到SMSContentObserver.java

  • 第 3-5 行:每筆簡訊都會收到兩次onChange(),第一次接收到uri為 “content://sms/raw”,此時尚未寫入簡訊內容,故忽略。
  • 第 7-11 行:讀取欄位,Telephony.Sms.Inbox.ADDRESS 為簡訊發送者,Telephony.Sms.Inbox.BODY則是簡訊內容。
  • 第 14 行:讀取簡訊收件匣。
  • 第 18 行:按日期反向(由大到小)排序,只取一筆。
  • 第 21 行:若能指到第一筆代表有資料。
  • 第 26 行:檢查發訊者是不是自己的手機號碼。(此步驟在實務上,應送到伺服器檢查。)
  • 第 27-29 行:將簡訊內容交由handler處理。

5. ContentObserver和UI溝通的橋樑 — Handler

SMSContentObserver要和UI溝通須透過Handler,在MainActivity.java內新增匿名類別handler並複寫handleMessage方法。

  • 第 4 行:取得smsContentObserver回傳的簡訊內容。
  • 第 5 行:將簡訊驗證碼寫入txtVerifyCode欄位。
  • 第 6 行:驗證。

6. 驗證

  • 第 2 行:檢查驗證碼是否正確。
  • 第 3 行:若正確則不再繼續監聽簡訊。
  • 第 4-9 行:顯示驗證成功之訊息框。此步驟可直接跳往驗證成功後要顯示給User看的頁面。

這樣,就完成了一個自己發送簡訊驗證碼給自己驗證的超無聊程式了  XD

mag_sms_verify_device_06

 

相關文章:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *