短信驗(yàn)證碼安卓手機(jī)自動(dòng)填寫(xiě)功能實(shí)現(xiàn)
2018-03-31 00:00:00
來(lái)源:
點(diǎn)擊:7609
喜歡:0

導(dǎo)讀
在進(jìn)行安卓應(yīng)用開(kāi)發(fā)的過(guò)程中都會(huì)涉及到注冊(cè)登錄功能模塊的實(shí)現(xiàn), 而許多的注冊(cè)或者登錄或者修改密碼功能常常是需要用戶手動(dòng)輸入短信驗(yàn)證碼,通常,用戶收到短信驗(yàn)證碼需要最小化應(yīng)用去查看短信然后回到應(yīng)用輸入相對(duì)于的驗(yàn)證碼,這個(gè)過(guò)程處理有點(diǎn)繁瑣,因此有必要應(yīng)用能夠自動(dòng)獲得下發(fā)成功的短信驗(yàn)證碼,方便用戶操作,提高用戶體驗(yàn)。
獲取短信原理
主要就是實(shí)時(shí)獲取短信信息,涉及到ContentObserver類(lèi)的使用,使用ContentProvider來(lái)監(jiān)聽(tīng)短信數(shù)據(jù)庫(kù)的變化,在自定義的ContentObserver當(dāng)中實(shí)現(xiàn)onChange 的方法進(jìn)行監(jiān)聽(tīng)特定手機(jī)號(hào)的短信, 然后進(jìn)行信息截取來(lái)填充到需要填充的位置。
ContentObserver即為內(nèi)容監(jiān)聽(tīng)者,當(dāng)我們發(fā)送一條短信到手機(jī)上時(shí),手機(jī)會(huì)自動(dòng)調(diào)用ContentObserver中的指定方法用來(lái)通知短信發(fā)生了變化,接著我們讀取短信中內(nèi)容,將驗(yàn)證碼提取出來(lái)自動(dòng)填寫(xiě)到輸入框中, 這樣就完成了自動(dòng)填寫(xiě)的功能。ContentObserver類(lèi)主要監(jiān)聽(tīng)短信內(nèi)容的變化, 這里涉及到Android常用的一種設(shè)計(jì)模式---【觀察者模式】。
ContentObserver 講解-觀察者模式
觀察者模式(有時(shí)又被成為發(fā)布(publish)-訂閱(Subscribe)模式,模型-視圖(View)模型,源-收聽(tīng)者(Listeber)模式或從屬者模式)是軟件設(shè)計(jì)模式中的一種,在此種模式中,一個(gè)目標(biāo)物件管理所有依賴(lài)于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知,這通常透過(guò)呼叫各種觀察者所提供的方法來(lái)實(shí)現(xiàn), 此種模式通常被用來(lái)實(shí)現(xiàn)事件處理系統(tǒng)。
觀察者模式(Observer)完美的將觀察者和被觀察者的對(duì)象分離開(kāi)。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維護(hù)性和重用性。
觀察者設(shè)計(jì)模式定義了對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,以便一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴(lài)于它的對(duì)象都得到通知并自動(dòng)刷新。
ContentObserver——內(nèi)容觀察者,目的是觀察(捕捉)特定Uri引起的數(shù)據(jù)庫(kù)的變化,繼而做一些相應(yīng)的處理,它類(lèi)似于數(shù)據(jù)庫(kù)技術(shù)中的觸發(fā)器(Trigger),當(dāng)ContentObserver所觀察的Uri發(fā)生變化時(shí),便會(huì)觸發(fā)它。
觀察者(即我們的應(yīng)用):Observer將自己注冊(cè)到被觀察對(duì)象(Subject)中,被觀察對(duì)象將觀察者存放在一個(gè)容器(Container)里。
被觀察(即系統(tǒng)的短信應(yīng)用):被觀察對(duì)象發(fā)生了某種變化,從容器中得到所有注冊(cè)過(guò)的觀察者,將變化通知觀察者。
撤銷(xiāo)觀察:觀察者告訴被觀察者要撤銷(xiāo)觀察,被觀察者從容器中將觀察者去除。
具體到我們的項(xiàng)目中,也就是說(shuō),當(dāng)應(yīng)用剛開(kāi)始運(yùn)行的時(shí)候,會(huì)向我們手機(jī)系統(tǒng)的短信應(yīng)用注冊(cè)一個(gè)觀察者,當(dāng)短信發(fā)生變化的時(shí)候,短信應(yīng)用會(huì)通知所注冊(cè)的觀察者發(fā)生了變化,我們的觀察者收到這樣的通知時(shí),就會(huì)根據(jù)代碼執(zhí)行相應(yīng)的操作,從而實(shí)現(xiàn)相關(guān)自動(dòng)填寫(xiě)驗(yàn)證碼的功能。當(dāng)我們完成所需要的功能時(shí),我們要撤銷(xiāo)觀察,解除注冊(cè),被觀察者從容器中將觀察者去除。觀察者被撤銷(xiāo)后不再收到短信的內(nèi)容變化通知。
觀察特定Uri的步驟如下:
創(chuàng)建我們特定的 ContentObserver 派生類(lèi),必須重載父類(lèi)構(gòu)造方法,必須重載 onChange() 方法去處理回調(diào)后的功能實(shí)現(xiàn)。
利用 context.getContentResolover() 獲得 ContentResolove 對(duì)象,接著調(diào)用 registerContentObserver() 方法去注冊(cè)內(nèi)容觀察者。
由于 ContentObserver 的生命周期不同步于 Activity 和 Service 等,因此,在不需要時(shí),需要手動(dòng)的調(diào)用 unregisterContentObserver() 去取消注冊(cè)。
短信的Uri共有一下幾種:
content:content:content:content:content:content:
具體實(shí)現(xiàn)代碼:
public class SmsObserver extends ContentObserver { public static final String SMS_URI_INBOX = "content://sms/inbox"; private Activity activity = null; private String smsContent = ""; private SmsListener listener; public SmsObserver(Activity activity, Handler handler, SmsListener listener) { super(handler); this.activity = activity; this.listener = listener; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Cursor cursor = null; ContentResolver contentResolver = activity.getContentResolver(); cursor = contentResolver.query(Uri.parse(SMS_URI_INBOX), new String[] { "_id", "address", "body", "read" }, "body like ? and read=?", new String[] { "%快遞%", "0" }, "date desc"); if (cursor != null) { cursor.moveToFirst(); if (cursor.moveToFirst()) { String smsbody = cursor .getString(cursor.getColumnIndex("body")); String regEx = "[^0-9]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(smsbody.toString()); smsContent = m.replaceAll("").trim().toString(); if (!TextUtils.isEmpty(smsContent)) { listener.onResult(smsContent); } } } } public interface SmsListener { void onResult(String smsContent); } }
使用如下:
SmsObserver smsObserver = new SmsObserver(this, new Handler(), new SmsListener() { @Override public void onResult(String smsContent) { } }); this.getContentResolver().registerContentObserver( Uri.parse("content://sms/"), true, smsObserver);
添加讀取短信的權(quán)限:
uses-permission android:name="android.permission.READ_SMS" />
嘉之元云通信致力于為客戶提供優(yōu)質(zhì)驗(yàn)證碼短信,營(yíng)銷(xiāo)短信、國(guó)際短信;國(guó)際直連通道可群發(fā)短信至任何國(guó)家和地區(qū),其短信驗(yàn)證碼、短信營(yíng)銷(xiāo)等106短信接口已服務(wù)了近兩萬(wàn)家企業(yè),提供短信接口API,幫助客戶快速接入!推薦閱讀:如何使用短信營(yíng)銷(xiāo)增加銷(xiāo)售額
上一篇:中國(guó)移動(dòng)ID類(lèi)短信網(wǎng)關(guān)錯(cuò)誤代碼匯總
下一篇:短信驗(yàn)證碼短信平臺(tái)常見(jiàn)的幾個(gè)問(wèn)題及解決辦法