馬玉春 汪文彬



摘 ?要: 智能手機的普及為用戶使用手機提供了便利,也帶來諸多不便。本文將手機聯系人區分為通訊簿聯系人、白名單、黑名單等,并結合參數設置和時間表設置,分別采用不同的策略進行處理;隱私數據本地保存和恢復,可以根據設置從靜音模式自動切換到正常模式,自動打開Wi-Fi等。最后對技術細節和知識點進行剖析,給出了教學應用方案。
關鍵詞: Android;聯系人;情景模式;Wi-Fi;攔截
中圖分類號: TP311.52 ? ?文獻標識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2020.01.006
本文著錄格式:馬玉春,汪文彬. Android個性化服務軟件的設計及教學應用[J]. 軟件,2020,41(01):2428
【Abstract】: The popularity of smart phones provides convenience for users to use them, but also brings many inconveniences. Mobile phone contacts are divided into system contacts, whitelists, and blacklists and so on, and different strategies are adopted to deal with them combined with parameter settings and timetable settings. Private data can be saved and restored locally, and can be automatically switched from silent mode to normal mode according to settings, and Wi-Fi can be automatically opened. Finally, the technical details and knowledge points are analyzed, and the teaching application solution is given.
【Key words】: Android; Contacts; Scenario mode; Wi-Fi; Blocking
0 ?引言
智能手機在給用戶帶來便利的同時也帶來了諸多不便,例如,上課時不能接聽電話和收發短信且不能響鈴;用戶為避免影響正常的工作和生活,不希望陌生電話或匿名電話及垃圾短信騷擾;開會和駕駛時不能接聽電話,如何自動告知對方自己所處的狀態?在深夜睡眠狀態,用戶不希望大部分電話呼入,但是,又希望能夠響應緊急聯系人;對于獨居老人,經常需要安靜地查看其所處位置和地理環境,但老人由于誤操作將情景模式設置為靜音并關閉Wi-Fi,視力不好又找不到對應的開關,導致子女無法跟老人電話聯系或微信視頻。本文以Android手機作為對象,解決智能手機使用中的常見問題,達到個性化服務的目的。
1 ?邏輯框架
為了方便使用智能手機,將聯系人分為普通名單(手機通訊簿中的成員)、白名單(緊急聯系人)、黑名單和陌生人,分別采用不同的策略進行處理。另外根據時間表設置機主的時間安排,如上課時間段、午休和睡覺時間段等;再用Switch組件設置臨時狀態,例如,開會或駕駛(本文僅以會議為例說明)。如果是黑名單用戶,則直接攔截,并更新當前日期和累加來電或短信次數(首次黑名單的添加在第3節介紹)。如果處于會議狀態,則攔截來電,禁止短信播放提示音,并根據設置回復“會議中,會后聯系……”。查詢時間表,如果處于上課狀態,同樣攔截來電,禁止短信播放提示音,回復的短信可以根據設置的參數自動查詢并添加下課時間。如果時間表上處于休息時間段,則禁止短信播放提示音,但當白名單來電時,允許正常撥入,否則直接攔截任何非白名單用戶。這里采用一個BlockStructure類用于控制邏輯,主要有是否攔截、是否白名單或黑名單等布爾屬性及主動回復的字符串短信內容屬性,以及查詢數據表和用戶配置的各個Switch的狀態。本服務軟件的基本邏輯處理框架如圖1所示。
2 ?主窗體設計
主窗體的設計圍繞圖1所示的邏輯框架展開,界面集成了來電顯示和回撥功能、短信接收和發送、各種名單(通訊簿、白名單和黑名單)的添加和刪除,通訊簿名單包括電話號碼和姓名,白名單只取姓名,黑名單只取電話號碼。軟件運行所需要的各項參數及各種數據表的查看和設置,都通過菜單項進行,而“參數設置”由于使用最頻繁,總是在標題欄上顯示,以方便用戶操作。
參數設置具有多個選項,主要用Switch組件來實現,對于時間表中的上課時間段,如果允許提示,則攔截后自動回復短信,回復對象可以是通訊簿中的普通名單、白名單或者包括陌生人(黑名單總是無條件攔截);對于會議開關,也采取這一策略。對于假期開關,如果假期有效,則上課時間段自動無效,電話可以正常撥入,短信提示音可以正常播放。白名單響鈴開關,如果設置為有效,即使手機的情景模式為振動或無聲,白名單呼入也可以自動切換為響鈴,該項功能主要為了方便老人使用,避免白名單子女無法聯系老人的情況。另外,還有攔截陌生人(不在系統通訊簿中)和匿名電話開關,一旦設置為有效,這些電話都將被攔截。點擊白名單中的選項,可以查詢其所在的地理位置,這在第4節詳細介紹。
3 ?主要的數據表及處理
圖2所示的黑名單數據表包括電話號碼(Phone)、日期(Date)、次數(Times)和備注(Remark),其中Phone字段是關鍵字,Date字段用來登記來電或短信的日期,Times用來累加來電或短信的次數,Remark是黑名單的分類(如“詐騙”、“騷擾”等)。首次添加黑名單時通過手動進行,其后自動更新日期和累計次數。查看黑名單時,根據日期進行降序排序,即最近的日期在最前面。數據表采用文獻[1]中的基于SQLite的通用數據庫類進行管理。黑名單的分類專門用一個文本文件存儲,利用ListView組件進行顯示,可以根據需要修改。
作為對黑名單的補充,設置了AreaCode表,只有一個頭部號碼字段HeadCode,凡是以該頭部號碼(如區號)開頭的電話全部攔截,這樣可以避免區域電話或某些虛擬電話的騷擾。
白名單為緊急聯系人,為了方便用戶,避免輸入電話號碼的麻煩,白名單數據表中用姓名(Name)來標識。接到來電后,通過系統通訊簿查找到姓名,然后再對照白名單。白名單的顯示順序可以根據用戶喜好進行手動調整,并調用Vibrator對象的vibrate方法振動手機。
時間表包括開始時間(Start)、結束時間(Stop)、業務類型(Business)和星期數(Weekday),以時間和星期的組合字段作為關鍵字。這里的業務類型主要以Class(上課)和Rest(休息)為主。上課期間攔截所有來電,可以根據設置的相應內容自動回復短信。如果處于放假狀態,則上課時間無效。在休息時間段,白名單作為緊急聯系人可以直通,其他所有號碼直接攔截。查看時間表時,根據時間升序排列。
各項數據表的顯示,都通過自定義ListView組件進行。以時間表為例,由于一行數據包含多個數據,需要設置一個自定義適配器TimeTableAdapter,其中存放TimeTableRowHolder類的對象,該對象包括時間表中的所有字段,在這個適配器中重寫添加、更新和刪除時間表記錄的方法。ListView對象調用其setAdapter方法設置TimeTableAdapter對象,建立與數據源之間的聯系。數據表中的數據,可以通過多線程技術調用FileOutputStream對象寫入外部文本文件,從而復制到外部存儲器保存;也可以調用FileInputStream對象從外部存儲器中恢復數據,便于換機操作。
4 ?地理位置的查詢
選擇圖2中的白名單,可以查詢其所在的地理位置。采用文獻[2]中的技術對待發送的短信進行加密,然后發送到目標手機。目標手機收到短信后進行解密,如果是白名單發送的查詢地理位置命令,則調用百度地圖的API函數,獲取經緯度數據,加密后返回給查詢手機。查詢手機解密短信后,將經緯度數據在百度地圖上進行標示,可以在2D地圖和衛星地圖之間切換,以便更加詳細地了解目標手機所處的地理位置。目標手機在地址查詢過程中,均自動處于靜音狀態,所收發的短信自動刪除,不影響目標手機持有者的工作與生活。
百度地圖 Android SDK是一套基于Android 4.0及以上版本設備的應用程序接口。可以使用該套 SDK開發適用于Android系統移動設備的地圖應用,通過調用地圖SDK接口,可以輕松訪問百度地圖服務和數據,構建功能豐富、交互性強的地圖類應用程序。該套地圖SDK免費對外開放,接口使用無次數限制。涉及百度地圖的應用軟件開發,首先需要申請百度帳號,申請成為百度地圖開發者,最好進行實名認證,這樣可以得到更好的服務。然后在百度地圖控制臺申請SDK開發密鑰,輸入“應用名稱”、“應用類型”和開發工具指紋信息等,提交后即可得到“應用AK”,這個“應用AK”將用于項目配置文件AndroidManifest.xml中,如圖3所示。
地理位置查詢需要手機安裝百度地圖,開通訪問網絡和地理位置的權限。
5 ?廣播接收器及其權限
當接到來電、收到短信或系統開機等,Android系統都會發出廣播,任何注冊了相應接收器的應用程序都可以收到廣播并執行相應的處理[3]。應用程序本身也可以自行送出廣播。大部分系統廣播接收器需要申請系統權限,廣播接收器的核心代碼是實現BroadcastReceiver類的onReceive抽象方法。表1所示是本文所使用的部分廣播接收器類及其對應的權限,第7個廣播接收器類GetDataRecever是自定義類,當后臺數據發生變化時,通知系統去更新界面,因而不需要任何權限。
個性化服務軟件常駐系統內存執行,具有系統軟件的特性,需要開機自動啟動,需要設置相關的權限,并需要用戶在安裝的時候授權。在開機接收器類BootCompleteReceiver中啟動服務,使得即使退出軟件主界面,也能讓軟件在后臺自動運行;OutGoingCallReceiver類可以監聽撥出電話,并在主界面顯示;PhoneStateReceiver類主要用于處理來電,獲取來電號碼進行一系列是否攔截的處理,主要任務在第1節的邏輯框架中進行,在這里還需要MODIFY_PHONE_STATE權限,用于攔截來電;SmsReceiver類用于接收短信,還需要READ_SMS權限讀取短信內容;SmsSentReceiver類和SmsDeliveredReceiver類都用于發送短信監測,前者監測短信是否發出,后者監測短信是否送達目標手機,兩者都需要SEND_SMS權限。
RingModeChangeReceiver類用于監測情景模式(響鈴、振動與靜音)的變化,需要READ_ SETTINGS權限讀取系統設置,還需要MODIFY_ AUDIO_SETTINGS權限,當白名單呼入時自動修改情景模式為響鈴狀態;WiFiChangeReceiver 類用于監測Wi-Fi開關設置,需要ACCESS_WIFI_STATE權限,為了免手機流量使用微信視頻,當發現Wi-Fi處于關閉狀態時,需要使用CHANGE_WIFI_STATE權限來打開Wi-Fi開關;ScreenChangeReceiver類用于監測屏幕狀態變化,當屏幕處于解鎖狀態時,自動讀取Wi-Fi開關狀態,及時打開Wi-Fi開關。
屏幕變化的廣播接收器不能在配置文件AndroidManifest.xml中注冊,只能通過代碼進行注冊,否則無效。老人由于視力不好或者文化程度不高,不小心將手機設置為靜音或者關閉Wi-Fi功能,導致白名單呼入無聲音,微信視頻無反應,自己找不到開關設置,最后的三個廣播接收器主要方便該類人群有效使用智能手機。
6 ?啟動服務的實現
服務是一個應用程序組件,它能夠在后臺執行一些耗時較長的操作,并且不提供用戶界面。服務能被其它應用程序的組件啟動,即使用戶切換到另外的應用時還能保持在后臺運行。此外,應用程序組件還能與服務綁定,并與服務進行交互,甚至能進行進程間通信(Inter-Process Communication,IPC)。比如,服務可以處理網絡傳輸、音樂播放、執行文件I/O或者與Content Provider進行交互,所有這些都是在后臺進行的[4]。
服務有兩種基本類型,即Started(啟動)和Bound(綁定)服務。Started服務是應用程序組件通過調用startService來啟動的,一旦被啟動,該服務就處于“started”狀態,服務就能在后臺一直運行下去,即使啟動它的組件已經被銷毀了。通常,started的服務執行單一的操作并且不會向調用者返回結果。例如,它可以通過網絡下載或上傳文件,當操作完成后,服務應該自行終止。如果組件通過調用startService啟動了服務,那么服務將一直保持運行,直至自行用stopSelf方法終止或由其它組件調用stopService方法來終止它。
當系統資源減少,為了保障擁有用戶焦點的應用程序正常運行,Android系統會強行終止一個服務。如果服務被擁有用戶焦點的Activity綁定著,則它一般不會被強行終止。如果服務聲明為“在前臺運行服務”,則它幾乎不會被終止。否則,如果服務已被啟動并且已運行了很長時間,那么系統將會隨著時間的推移而降低它在后臺任務列表中的級別,此類服務將很有可能會被強行終止。如果系統終止了服務,只要資源再度夠用,系統就會再次啟動服務(當然這還取決于onStartCommand方法的返回值)。
個性化服務軟件是一個系統級的服務軟件,可以直接運行軟件啟動服務,也可以利用上一節的BootCompleteReceiver廣播接收器在手機開機后自動啟動服務,從而對手機進行各種監測。為了避免本軟件被Android內存管理系統銷毀,可以在啟動的服務中構建一個通知欄圖標Notification的對象notify。PendingIntent對象pi指向主窗體,通過調用notify的setContentIntent方法并傳入該pi對象,即可通過點擊通知圖標打開主窗體;方法setOngoing中傳入true,表示有正在執行的后臺任務;方法setPriority中傳入參數Notification.PRIORITY_ MAX,使得該圖標被置于最前列。在服務的onCreate方法中調用startForeground方法將服務放到前臺執行。
7 ?軟件測試
軟件測試圍繞主窗體和邏輯框架進行,首先在主窗體中測試來電顯示、回撥電話、接收短信和發送短信功能,然后測試將電話號碼加入系統通訊簿、白名單或黑名單中,也可直接嘗試刪除[5]。從主窗體的菜單項進入時間表、白名單、黑名單及其種類窗體,查看數據項的添加與刪除,備份與恢復功能。最后結合參數設置進行綜合測試,查看來電及接收短信,能否在特定條件下被攔截或放行。關于白名單地理位置查詢功能,需要確保本機與目標手機都安裝百度地圖軟件,目標手機處于聯網狀態,這樣才能獲取地理位置并以短信形式返回。圖4所示為查詢白名單所在地理位置的效果,經緯度也一并顯示。
8 ?教學應用
本文所研發的Android個性化服務軟件是一個系統級服務軟件,綜合應用了前臺和后臺的主要技術。在教學應用中,可以先讓學生安裝使用該軟件,使得手機處于正常模式,由于時間表的限制,上課可以自動攔截來電而不會有響鈴干擾。然后,將知識點進行分解,首先從簡單的菜單使用、多窗體及其參數傳遞開始入手,搭建一個最基本的框架;然后學習SQLite數據庫,為APP添加數據庫功能,在此基礎之上利用多線程技術導出數據庫中的數據至外部文本文件,或者從外部文本文件恢復數據;第三,掌握系統廣播接收器的注冊與監測技術,及自定義廣播接收器的使用方法,逐個嘗試,深入理解;最后將以上技術進行整合,添加服務功能,使其成為一個綜合實用的技術載體[6]。
9 ?結語
本文所完成的Android個性化服務軟件,將聯系人分為系統通訊簿、白名單、黑名單、陌生人和匿名,結合時間表和多種參數設置,分別采用不同的控制策略,使得手機可以一直處于正常的情景模式,也不會影響日常工作、生活與學習。各種隱私數據可以備份到本地文本文件,也可以從本地文本文件恢復,有效避免了隱私泄漏的可能。可以根據設置的參數自動將情景模式從靜音模式切換到正常模式,自動打開Wi-Fi方便老年人使用智能手機,也可以查詢白名單聯系人的地理位置,并以2D地圖或者衛星地圖進行顯示。最后對個性化服務軟件的技術細節和知識點進行分解,從前臺到后臺,從簡單到復雜剖析了學習和掌握相關技術的方法。
參考文獻
[1] 劉雍, 孫冰, 馬玉春. Android平臺下的通用SQLite模型的設計與實現[J]. 電腦編程技巧與維護, 2017, 4:41-42+59.
[2] 劉雍, 汪文彬, 馬玉春. Android環境下的數據編碼與處理技術[J]. 電腦編程技巧與維護, 2018, 9:71-74+107.
[3] 王小科, 寇長梅. Android入門經典[M]. 北京: 機械工業出版社, 2013.
[4] 陳佳, 李樹強. Android移動開發[M]. 北京: 人民郵電出版社, 2016.
[5] 孫紅麗, 葉斌. 基于Android 的通訊錄系統的設計與實現[J]. 軟件, 2015, 36(5): 117-120.
[6] 馬玉春, 劉雍, 汪文彬. Android平臺下的TCP客戶機教學設計[J]. 軟件, 2018, 39(10):14-17.
[7] 王志國, 楊維. 基于Android 平臺酒店人員定位系統的設計與實現[J]. 軟件, 2015, 36(10): 65-67.
[8] 張二江, 遲瀟瀟, 肖亞鐵. 基于Android 平臺的實時隱秘報警系統設計與實現[J]. 軟件, 2015, 36(4): 28-32.
[9] 張曉諾. 基于Android 的智能家居環境監測系統APP 設計與實現[J]. 軟件, 2015, 36(2): 77-79.
[10] 李淑民. Android 手機隱私泄露研究[J]. 軟件, 2015, 36(2): 69-72.