【正文】
簡潔明了,設(shè)置了三個按鈕及兩個文本,都有對應(yīng)的點擊事件相應(yīng),具體效果可以在運行及測試中看到。 圖形開發(fā)界面應(yīng)用用戶分為三種,未注冊用戶,注冊用戶,管理員。在應(yīng)用啟動后,未注冊只會顯示一個測試按鈕可用,其他按鈕則處于“不可用”狀態(tài),通過setEnable()對其設(shè)置,代碼如下: (false)。而注冊界面,因為暫時不需要輸入太多信息的緣故,采用了彈出對話框的模式,設(shè)置“用戶名”和“密碼”兩個文本編輯框,三個按鈕“取消”“注冊”“登錄”,用戶不論是注冊還是登錄都在此對話框中進行。 dialog_edit_password = (EditText) view .findViewById()。 (().toString(), ().toString())。 (().toString(), ().toString())。以上代碼為設(shè)置對話三個按鈕的響應(yīng)事件,可以看到為“注冊”“登錄”兩個按鈕都設(shè)置了相應(yīng)的監(jiān)聽器,并將文本編輯框中填寫的文本傳入處理方法中。 boolean existFlag = false。 (e, (existFlag))。 } else { if (() 4 || () 6) { (getApplicationContext(), 用戶名或密碼長度不符合標(biāo)準, ).show()。 (user)。 User user = new User(username, password)。 (true)。 (user, username)。 } else { (false)。 }}可以看到,在這兩個方法中出現(xiàn)了User與userMgr兩個類,User為一個封裝的用戶對象,成員變量僅兩個,即用戶名與密友;userMgr為UserManager一個實例,UserManager則為繼承SqliteOpenHelper的一個子類,用于管理數(shù)據(jù)庫,具體代碼過多,此處不再贅述,讀者可自行查閱源碼[13]。除此之外,還有設(shè)置繪圖中的自動定時功能,和個人用戶的密碼修改功能。點擊“查詢用戶”后,會給出當(dāng)前已注冊的用戶列表,部分代碼如下;protected void userList() { ListUser users = ()。 for (int i = 0。 i++) { User user = (i)。 (username, ())。 (userItem)。 (adapter)。第四章 運行及測試1) 在應(yīng)用程序中找到HealthPluse,打開后可以顯示主界面,點擊“測試”按鈕,應(yīng)用會提示打開藍牙,點擊“允許”后,顯示設(shè)備列表,; 2) 列表會顯示周圍可檢測到的BLE設(shè)備,;3) 點擊設(shè)備名稱,進入測試頁面,因為沒有接觸傳感器的緣故,傳輸?shù)臄?shù)據(jù)一直是穩(wěn)定在一個固定的數(shù)值,當(dāng)手指接觸傳感器后,就會有明顯起伏,然后逐漸規(guī)律下來,并且這時也可計算出BPM,; 4) 當(dāng)波形較為穩(wěn)定時,點擊“定時”按鈕,定時器就會打開,用戶可根據(jù)自己需要保存一定時間的波形數(shù)據(jù),點擊“保存”即可,;5) 退出此界面,回到主界面,點擊“咨詢”按鈕,可以進入到咨詢頁面,點擊頁面底部的三個按鈕可切換頁面,; 6) 點擊“播放”按鈕(開關(guān)),可以動態(tài)或觀察在測試界面下保存的數(shù)據(jù)文件,因為處理經(jīng)過處理的關(guān)系,數(shù)據(jù)會比測試時的繪圖更加精確,但波形效果較差,; 1) 在主界面左下方點擊“注冊”文本,可彈出注冊對話框,; 2) 填入用戶名及密碼后,點擊“注冊”回到主界面,此時咨詢和設(shè)置按鈕已經(jīng)成可用狀態(tài),且主界面右上角也顯示當(dāng)前登錄的用戶名稱,; 3) 點擊“設(shè)置”按鈕,進入設(shè)置選項,顯示設(shè)置菜單,目前開放的有用戶管理,繪圖參數(shù)修改,和用戶密碼修改功能,;4) 點擊“設(shè)置”按鈕,設(shè)置選項中對普通用戶開放的有查詢用戶功能,及繪圖和個人設(shè)置,增加或刪除用戶的功能被默認為僅管理員可用,此處是設(shè)計者自己保留的賬號,僅以自娛,; 5) 刪除用戶會彈出一個多選框,被選中的用戶都會從數(shù)據(jù)庫中刪除,由查詢功能可得知刪除已經(jīng)生效,; 6) 點擊“參數(shù)設(shè)置”選項,可以打開繪圖屬性的設(shè)置對話框,輸入相應(yīng)的數(shù)值數(shù)據(jù),確定之后可以在測試功能下顯示出圖表對應(yīng)的參數(shù)變化,; 1. 傳感器接觸引起的數(shù)據(jù)不穩(wěn)定由于光電傳感器沒有經(jīng)過任何封裝,器件皆裸露在外,所以使用的方式不當(dāng),會明顯影響傳輸?shù)目煽啃?,一般表現(xiàn)為數(shù)據(jù)起伏劇烈,體現(xiàn)在波形上就是數(shù)據(jù)沒有規(guī)律性。解決的方法較為簡單,即測試時用指肚將傳感器的發(fā)光燈完全覆蓋住,光沒有在邊緣漏出時效果最好,傳輸?shù)臄?shù)據(jù)也最穩(wěn)定。解決方法是從程序代碼中去修改繪圖的頻率,即以下代碼塊的中用于除數(shù)的數(shù)字,2即代表將傳來的數(shù)據(jù)以2:1的比例用于繪圖, if (() % 2 == 0) { // 繪圖方法體…… }經(jīng)測試,繪圖頻率一般保持在30Hz以下效果較為流暢,因此可以將藍牙傳輸?shù)臄?shù)據(jù)的頻率設(shè)為50Hz,然后在接收繪圖時以2:1比例采集繪圖數(shù)據(jù)。Android的線程操作有效的主要有兩種方法,如下:方法一:Runable+Handlerstatic Handler pluseHandler=new Handler()。 } catch (IOException e) { ()。 (this, 20)。private void refreshChart() { (run,0)。Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch () { case 1: refreshChart()。 case 2: break。 }。(new TimerTask() { Override public void run() { Message message = new Message()。 else = 2。 }}, 0, 20)。2. 注冊權(quán)限開放問題(包括管理數(shù)據(jù)庫)本設(shè)計中將權(quán)限分為三級,管理員擁有最高權(quán)限,普通注冊用戶,未注冊用戶;這其中要對用戶使用應(yīng)用的功能部分做一定的限制,而限制用戶,首先要判斷目前是否有登錄的用戶,或是登錄的用戶是屬于哪一類用戶。;然后問題又出現(xiàn)了,如果用戶已經(jīng)登錄過一次,那么每次打開應(yīng)用還需要重新登錄么?用戶肯定是不認同的,所以每次打開應(yīng)用時,如果找到了,說明已經(jīng)登錄過,用戶不用登錄即可直接使用,如果沒有找到,則需要用戶再次注冊登錄;protected void userIsEmpty() { String user = (user, null)。 (true)。 } else { (false)。 }}上述代碼放在主界面中,即一進入應(yīng)用就進行判斷工作,以方便用戶;此外,有登錄功能,肯定也要有相應(yīng)的注銷功能,;().mit()。(false)??梢詮拇a中看出,注銷以后需要將權(quán)限恢復(fù)至未注冊的狀態(tài);同樣地,對于管理員權(quán)限也是進行同樣的判斷,同樣是在主界面中判斷當(dāng)前用戶是否為管理員用戶;此處也存在一個問題,即“設(shè)置”中的查詢用戶功能可以查看當(dāng)前所有用戶的用戶名與密碼,為了彌補此漏洞,設(shè)計者將顯示列表中的管理員用戶的密碼設(shè)置為“******”,即防止注冊用戶看到密碼后用管理員用戶進行登錄;管理員用戶應(yīng)該是內(nèi)置的,即程序本身已經(jīng)創(chuàng)建的,而不是通過注冊界面進行創(chuàng)建的,這就需要在啟動應(yīng)用時就創(chuàng)建一個管理員用戶,并且在其后的啟動過程中判斷用戶數(shù)據(jù)庫中是否有此管理員用戶,如果不存在,則創(chuàng)建管理員用戶,且此管理員是固定用戶名和密碼的;private void addAdmin() { ListUser users = ()。 if ((user)) { } else { (user)。 if ((admin)) { (true)。 } else { (false)。 }}第一個方法放在主界面下,即添加管理員用戶,第二個方法放在設(shè)置界面,因為管理員主要是在設(shè)置中擁有較大的權(quán)限,比如刪除用戶。首先出現(xiàn)的問題是由傳感器采集給出的波形并不精細,本設(shè)計是采用50Hz的抽樣頻率,以保證波形圖可以手機終端成功繪出或是及時保存下數(shù)據(jù)文件,而面對專業(yè)分析時,這樣的采樣頻率偏低,很難分析出有用的信息;接著是對于波形周期及其波峰波谷的確定,確定波峰的算法稱為“尋峰算法”,難度較大,資料相對較少,本設(shè)計中對于波形周期的確定是由于傳感器采集到的數(shù)據(jù)起伏較為明顯,且有相對穩(wěn)定的界限,可以由波形上揚一次就判定一個波峰形成,但這畢竟只適合當(dāng)前的采集的數(shù)據(jù),更可惜的是,除此之外,難以判定其他有用的信息;再次是算法移植問題,在專門的數(shù)值分析軟件如Matlab上可以使用軟件已經(jīng)集成的數(shù)學(xué)函數(shù),但在Java或Android平臺上并沒有這些方便的函數(shù)可提供使用,且一門語言之所以使用廣泛,是因為其可滿足的需求多樣性,并不專注于一個領(lǐng)域的開發(fā),因而用Java或C寫一個專門分析數(shù)值的軟件有難度。 總結(jié)此次畢業(yè)設(shè)計,名為“基于Android的便攜式健康監(jiān)測系統(tǒng)”,從技術(shù)上來說,難點在于“基于Android”,即移動開發(fā);從內(nèi)容上來說,難點在于“健康監(jiān)測”,即應(yīng)用功能中就具備健康分析與建議模塊。我的工作主要集中在對軟件應(yīng)用的開發(fā)及調(diào)試上,開發(fā)前期的工作,主要為設(shè)置界面布局,這并不困難,但隨之而來的是應(yīng)用的一個核心問題:繪圖--不論在哪一種編程語言中,繪圖都不是一件簡單的事情;嘗試過用Java本身自帶的類,效果并不理想,因為對于一個視覺應(yīng)用,尤其是展示脈搏這樣的屬性,實時的波形圖才是最有說服力的,于是難點劃分成三個,先要有圖,然后能成為波形,最后,使其實時顯示;經(jīng)過一番查證嘗試,這個應(yīng)用最大的難題被成功拿下--使用已經(jīng)成熟的繪圖引擎是必要的選擇。后期則是對應(yīng)用進行一些普及的開發(fā),即每個應(yīng)用一般都有的“注冊”“設(shè)置”功能,又或是對脈搏數(shù)據(jù)的一些簡單分析,隨著工作的逐步進行,功能漸漸完善,也越來越像一個真正的應(yīng)用軟件了。參考文獻[1] 王碩,宮恩浩,[J],中國醫(yī)療器械雜志2011,35(6): 402408.[2] 蔡承賢,[J],中國醫(yī)療器械雜志,2010,34(1):13.[3] :醫(yī)療物聯(lián)網(wǎng)潮流先鋒[J],新經(jīng)濟導(dǎo)刊,:4549.[4] 孟濬,[J],計算機應(yīng)用研究,30(7):20552060.[5] Choi, type and effect system for activation flow of ponents in Android programs[J],Information Processing Letters, 2014,(11):620627.[6] Ham,Hyung Kil,Mobile application patibility test system design for Android fragmentation[J],Communications in Computer and Information Science,2011,(257):314320.[7] [M],電子工業(yè)出版社,.[8] 于智鵬,:Android核心技術(shù)[M],.[9] 藺華,[M],電子工業(yè)出版社,.[10] [M],電子工業(yè)出版社,.[11] 方欣,[M],電子工業(yè)出版社,.[12] 吳亞峰,杜化美,[M],電子工業(yè)出版社,.[13] [M],中國水利水電出版社,.[14] Android SDK開發(fā)范例大全[M],人民郵電出版社,.附錄一 外文文獻翻譯ModelDriven Design for the Development of MultiPlatform Smartphone ApplicationsAbstractTo ensure revenues,developers of smartphone applications should support all the main leading platforms which share the market thus increasing timetomarket and development solve this problem,the paper proposes a ModelDriven Design flow to develop a single version of the application that can be automatically translated into the main platformdependent approach is based on code generation so that no additional library or process is needed on the smartphone to support different introduce a UML2 profile to represent the elements of the application independently of the target plat