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