|
等級(jí)制度
在上一集里,我們把發(fā)送查詢(xún)短信息的人分為"聯(lián)系人"和"陌生人"兩大類(lèi),應(yīng)用程序會(huì)自動(dòng)回復(fù)"聯(lián)系人",忽略"陌生人",在這一集里,我們將會(huì)引入另外兩種類(lèi)型:"白名單"和"黑名單"。如果你看過(guò)上一集,你應(yīng)該知道"聯(lián)系人"和"陌生人"是互斥的,它們之間的區(qū)別是手機(jī)號(hào)碼是否存在聯(lián)系人里。"白名單"和"黑名單"是在"聯(lián)系人"上發(fā)展出來(lái)的兩個(gè)細(xì)分類(lèi)型,它們也是互斥的,"白名單"允許執(zhí)行所有查詢(xún),而"黑名單"則禁止執(zhí)行所有查詢(xún)。至于"陌生人",我們將會(huì)給它一個(gè)"注冊(cè)"的機(jī)會(huì),讓它可以請(qǐng)求把自己加到聯(lián)系人里。這四個(gè)等級(jí)將會(huì)通過(guò)AccessLevel枚舉來(lái)表達(dá):
代碼 1
在這一集里,我們將會(huì)在這個(gè)"等級(jí)制度"的基礎(chǔ)上實(shí)現(xiàn)如下效果:
訪問(wèn)級(jí)別 | 允許執(zhí)行的操作 |
Whitelist | PingStatus、PingSchedule |
Contact | PingStatus |
Stranger | SignUp |
Blacklist | N/A |
如何界定訪問(wèn)級(jí)別?
首先,發(fā)送方要么在聯(lián)系人里,要么不在,如果不在,那么他/她的訪問(wèn)級(jí)別就是Stranger,如果在,我們還要看看他/她是否在白名單或者黑名單里,如果也在,那么他/她的訪問(wèn)級(jí)別就是Whitelist或者Blacklist,否則就是Contact。就實(shí)現(xiàn)方式而言,我們應(yīng)該優(yōu)先考慮檢查白名單和黑名單,因?yàn)閺募系慕嵌葋?lái)看,它們均是聯(lián)系人的子集,如果發(fā)送方在任一名單里,我們就可以立即返回他/她的訪問(wèn)級(jí)別,而不必遍歷所有聯(lián)系人,于是,我們可以這樣獲取發(fā)送方的訪問(wèn)級(jí)別:
代碼 4
那么,查詢(xún)操作的訪問(wèn)級(jí)別又如何獲取呢?我們知道,應(yīng)用程序(目前)只支持三種查詢(xún)操作,每種操作所需的最低訪問(wèn)級(jí)別如下表所示:
查詢(xún)操作 | 所需的最低訪問(wèn)級(jí)別 |
PingStatus | Contact |
PingSchedule | Whitelist |
SignUp | Stranger* |
請(qǐng)把我加為好友……
下面,我們將會(huì)實(shí)現(xiàn)SignUp操作。首先,我們要定義這個(gè)操作的短信息,很明顯,它包含的數(shù)據(jù)將用于創(chuàng)建Outlook聯(lián)系人,最低限度應(yīng)該提供姓名和手機(jī)號(hào)碼:
{Trombone:SignUp(Leehom,Wang,13813572468)}
用戶(hù)界面也需要做出相應(yīng)調(diào)整:
圖 11
這個(gè)用戶(hù)界面僅向用戶(hù)收集姓名,那么,我們?nèi)绾潍@取本機(jī)的號(hào)碼?你可以通過(guò)P/Invoke調(diào)用SmsGetPhoneNumber函數(shù),也可以像我這樣,使用OpenNETCF的Smart Device Framework。下載、安裝Smart Device Framework 2.3,添加對(duì)OpenNETCF.Phone.dll的引用,接著就是修改Ping按鈕的代碼了(原本的代碼參見(jiàn)《WM有約II(四):你明天有空嗎?》的代碼14):
代碼 7
好了,運(yùn)行一下看看效果:
圖 12
再來(lái)看看Cellular Emulator,很好,注冊(cè)短信息順利發(fā)出了:
圖 13
接下來(lái)就是注冊(cè)短信息的處理了,因?yàn)樗会槍?duì)陌生人,而且無(wú)需自動(dòng)回復(fù),所以我們不必遵守SmsProcessorBase類(lèi)的套路,直接讓SignUpProcessor類(lèi)實(shí)現(xiàn)ISmsProcessor接口就可以了。在實(shí)現(xiàn)SignUpProcessor.Process方法之前,我們需要一個(gè)輔助方法來(lái)提取注冊(cè)短信息里的數(shù)據(jù):
代碼 8
因?yàn)樽?cè)短信息的處理需要用戶(hù)的參與,用戶(hù)有權(quán)決定把發(fā)送方添加到聯(lián)系人還是忽略他/她,所以應(yīng)用程序應(yīng)該把截獲的注冊(cè)短信息添加到某個(gè)隊(duì)列里,以便用戶(hù)過(guò)后查詢(xún)和處理,避免用戶(hù)在應(yīng)用程序截獲注冊(cè)短信息時(shí)不得不馬上處理的尷尬情景。為此,我們需要一個(gè)RegistrationQueue來(lái)暫存待處理的注冊(cè)請(qǐng)求,由于每個(gè)注冊(cè)請(qǐng)求都包含了接收時(shí)間、姓名和手機(jī)號(hào)碼,于是我們用一個(gè)Registration類(lèi)來(lái)存放這些數(shù)據(jù):
代碼 9
由于這些數(shù)據(jù)有可能跨越多個(gè)應(yīng)用程序會(huì)話(huà),于是我們需要把它們持久化到文件里,這里我還是選擇使用XML:
代碼 10
因?yàn)镽egistrationQueue的實(shí)現(xiàn)和InterceptionHistory(參見(jiàn)《WM有約II(五):區(qū)別對(duì)待不同的手機(jī)號(hào)碼》)相似,所以我就不在這里一一細(xì)說(shuō)了。
回到SignUpProcessor.Process方法,在截獲注冊(cè)短信息時(shí),我們需要判斷發(fā)送方是否陌生人,若是,把相關(guān)數(shù)據(jù)添加到RegistrationQueue,否則,忽略該注冊(cè)短信息。另外,我們還需要在InterceptionHistory里等級(jí)本次截獲:
代碼 11
最后,我們需要為此配備一個(gè)用戶(hù)界面:
圖 14
當(dāng)應(yīng)用程序啟動(dòng)時(shí),我們要把RegistrationQueue綁定到上面的DataGrid:
代碼 12
當(dāng)DataGrid上選中的行發(fā)生改變時(shí),下面的兩個(gè)TextBox的內(nèi)容要更新為當(dāng)前選中行的姓名:
代碼 13
當(dāng)用戶(hù)單擊Add按鈕時(shí),應(yīng)用程序?qū)?huì)用當(dāng)前選中的注冊(cè)信息來(lái)創(chuàng)建Outlook聯(lián)系人,創(chuàng)建完畢后將會(huì)把注冊(cè)信息從RegistrationQueue里刪除:
代碼 14
而當(dāng)用戶(hù)單擊Remove按鈕時(shí),應(yīng)用程序?qū)?huì)直接把當(dāng)前選中的注冊(cè)信息從RegistrationQueue里刪除。
好了,又到了測(cè)試的時(shí)候了(在測(cè)試之前,別忘了把SignUpProcessor掛接到InterceptorManager里!),通過(guò)Cellular Emulator發(fā)送如下注冊(cè)短信息:
{Trombone:SignUp(Leehom,Wang,13813572468)}
圖 15
現(xiàn)在,我們把注意力集中到模擬器上:
圖 16
從上圖可以看到,注冊(cè)短信息已被成功截獲,單擊Add按鈕,應(yīng)用程序?qū)?huì)用選中的注冊(cè)信息創(chuàng)建Outlook聯(lián)系人:
圖 17
此時(shí),如果我們通過(guò)Cellular Emulator使用剛才的手機(jī)號(hào)碼發(fā)送如下查詢(xún)短信息:
{Trombone:PingStatus}
將會(huì)收到應(yīng)用程序的自動(dòng)回復(fù):
圖 18
而主界面上的截獲歷史也能正確顯示發(fā)送方的姓名了:
圖 19
你還想要什么?
有一次,我和一個(gè)六年級(jí)的學(xué)生一起看動(dòng)畫(huà)片,當(dāng)我們看到正義的代表向怪獸發(fā)動(dòng)反擊時(shí),我問(wèn)他:"你現(xiàn)在看到這種情節(jié)還會(huì)覺(jué)得體內(nèi)有一股激動(dòng)在奔流嗎?"他說(shuō)沒(méi)有。曾幾何時(shí),當(dāng)我們碰到可以使用新技術(shù)的機(jī)會(huì)時(shí),我們也會(huì)異常激動(dòng)……
或許,在很多人的眼里,技術(shù)只不過(guò)是用來(lái)解決問(wèn)題的工具罷了,然而,我更傾向于通過(guò)學(xué)習(xí)/使用技術(shù)尋找樂(lè)趣。下一集,要不我們?cè)囈幌耫b4o吧,然后,再試一下Windows Mobile上的Notification,就是當(dāng)你收到短信息時(shí)屏幕下面彈出的提示框……
NET技術(shù):WM有約II(六):分級(jí)限制,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。