【正文】
簡潔明了,設(shè)置了三個(gè)按鈕及兩個(gè)文本,都有對(duì)應(yīng)的點(diǎn)擊事件相應(yīng),具體效果可以在運(yùn)行及測試中看到。 圖形開發(fā)界面應(yīng)用用戶分為三種,未注冊(cè)用戶,注冊(cè)用戶,管理員。在應(yīng)用啟動(dòng)后,未注冊(cè)只會(huì)顯示一個(gè)測試按鈕可用,其他按鈕則處于“不可用”狀態(tài),通過setEnable()對(duì)其設(shè)置,代碼如下: (false)。而注冊(cè)界面,因?yàn)闀簳r(shí)不需要輸入太多信息的緣故,采用了彈出對(duì)話框的模式,設(shè)置“用戶名”和“密碼”兩個(gè)文本編輯框,三個(gè)按鈕“取消”“注冊(cè)”“登錄”,用戶不論是注冊(cè)還是登錄都在此對(duì)話框中進(jìn)行。 dialog_edit_password = (EditText) view .findViewById()。 (().toString(), ().toString())。 (().toString(), ().toString())。以上代碼為設(shè)置對(duì)話三個(gè)按鈕的響應(yīng)事件,可以看到為“注冊(cè)”“登錄”兩個(gè)按鈕都設(shè)置了相應(yīng)的監(jiān)聽器,并將文本編輯框中填寫的文本傳入處理方法中。 boolean existFlag = false。 (e, (existFlag))。 } else { if (() 4 || () 6) { (getApplicationContext(), 用戶名或密碼長度不符合標(biāo)準(zhǔn), ).show()。 (user)。 User user = new User(username, password)。 (true)。 (user, username)。 } else { (false)。 }}可以看到,在這兩個(gè)方法中出現(xiàn)了User與userMgr兩個(gè)類,User為一個(gè)封裝的用戶對(duì)象,成員變量僅兩個(gè),即用戶名與密友;userMgr為UserManager一個(gè)實(shí)例,UserManager則為繼承SqliteOpenHelper的一個(gè)子類,用于管理數(shù)據(jù)庫,具體代碼過多,此處不再贅述,讀者可自行查閱源碼[13]。除此之外,還有設(shè)置繪圖中的自動(dòng)定時(shí)功能,和個(gè)人用戶的密碼修改功能。點(diǎn)擊“查詢用戶”后,會(huì)給出當(dāng)前已注冊(cè)的用戶列表,部分代碼如下;protected void userList() { ListUser users = ()。 for (int i = 0。 i++) { User user = (i)。 (username, ())。 (userItem)。 (adapter)。第四章 運(yùn)行及測試1) 在應(yīng)用程序中找到HealthPluse,打開后可以顯示主界面,點(diǎn)擊“測試”按鈕,應(yīng)用會(huì)提示打開藍(lán)牙,點(diǎn)擊“允許”后,顯示設(shè)備列表,; 2) 列表會(huì)顯示周圍可檢測到的BLE設(shè)備,;3) 點(diǎn)擊設(shè)備名稱,進(jìn)入測試頁面,因?yàn)闆]有接觸傳感器的緣故,傳輸?shù)臄?shù)據(jù)一直是穩(wěn)定在一個(gè)固定的數(shù)值,當(dāng)手指接觸傳感器后,就會(huì)有明顯起伏,然后逐漸規(guī)律下來,并且這時(shí)也可計(jì)算出BPM,; 4) 當(dāng)波形較為穩(wěn)定時(shí),點(diǎn)擊“定時(shí)”按鈕,定時(shí)器就會(huì)打開,用戶可根據(jù)自己需要保存一定時(shí)間的波形數(shù)據(jù),點(diǎn)擊“保存”即可,;5) 退出此界面,回到主界面,點(diǎn)擊“咨詢”按鈕,可以進(jìn)入到咨詢頁面,點(diǎn)擊頁面底部的三個(gè)按鈕可切換頁面,; 6) 點(diǎn)擊“播放”按鈕(開關(guān)),可以動(dòng)態(tài)或觀察在測試界面下保存的數(shù)據(jù)文件,因?yàn)樘幚斫?jīng)過處理的關(guān)系,數(shù)據(jù)會(huì)比測試時(shí)的繪圖更加精確,但波形效果較差,; 1) 在主界面左下方點(diǎn)擊“注冊(cè)”文本,可彈出注冊(cè)對(duì)話框,; 2) 填入用戶名及密碼后,點(diǎn)擊“注冊(cè)”回到主界面,此時(shí)咨詢和設(shè)置按鈕已經(jīng)成可用狀態(tài),且主界面右上角也顯示當(dāng)前登錄的用戶名稱,; 3) 點(diǎn)擊“設(shè)置”按鈕,進(jìn)入設(shè)置選項(xiàng),顯示設(shè)置菜單,目前開放的有用戶管理,繪圖參數(shù)修改,和用戶密碼修改功能,;4) 點(diǎn)擊“設(shè)置”按鈕,設(shè)置選項(xiàng)中對(duì)普通用戶開放的有查詢用戶功能,及繪圖和個(gè)人設(shè)置,增加或刪除用戶的功能被默認(rèn)為僅管理員可用,此處是設(shè)計(jì)者自己保留的賬號(hào),僅以自娛,; 5) 刪除用戶會(huì)彈出一個(gè)多選框,被選中的用戶都會(huì)從數(shù)據(jù)庫中刪除,由查詢功能可得知?jiǎng)h除已經(jīng)生效,; 6) 點(diǎn)擊“參數(shù)設(shè)置”選項(xiàng),可以打開繪圖屬性的設(shè)置對(duì)話框,輸入相應(yīng)的數(shù)值數(shù)據(jù),確定之后可以在測試功能下顯示出圖表對(duì)應(yīng)的參數(shù)變化,; 1. 傳感器接觸引起的數(shù)據(jù)不穩(wěn)定由于光電傳感器沒有經(jīng)過任何封裝,器件皆裸露在外,所以使用的方式不當(dāng),會(huì)明顯影響傳輸?shù)目煽啃?,一般表現(xiàn)為數(shù)據(jù)起伏劇烈,體現(xiàn)在波形上就是數(shù)據(jù)沒有規(guī)律性。解決的方法較為簡單,即測試時(shí)用指肚將傳感器的發(fā)光燈完全覆蓋住,光沒有在邊緣漏出時(shí)效果最好,傳輸?shù)臄?shù)據(jù)也最穩(wěn)定。解決方法是從程序代碼中去修改繪圖的頻率,即以下代碼塊的中用于除數(shù)的數(shù)字,2即代表將傳來的數(shù)據(jù)以2:1的比例用于繪圖, if (() % 2 == 0) { // 繪圖方法體…… }經(jīng)測試,繪圖頻率一般保持在30Hz以下效果較為流暢,因此可以將藍(lán)牙傳輸?shù)臄?shù)據(jù)的頻率設(shè)為50Hz,然后在接收繪圖時(shí)以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. 注冊(cè)權(quán)限開放問題(包括管理數(shù)據(jù)庫)本設(shè)計(jì)中將權(quán)限分為三級(jí),管理員擁有最高權(quán)限,普通注冊(cè)用戶,未注冊(cè)用戶;這其中要對(duì)用戶使用應(yīng)用的功能部分做一定的限制,而限制用戶,首先要判斷目前是否有登錄的用戶,或是登錄的用戶是屬于哪一類用戶。;然后問題又出現(xiàn)了,如果用戶已經(jīng)登錄過一次,那么每次打開應(yīng)用還需要重新登錄么?用戶肯定是不認(rèn)同的,所以每次打開應(yīng)用時(shí),如果找到了,說明已經(jīng)登錄過,用戶不用登錄即可直接使用,如果沒有找到,則需要用戶再次注冊(cè)登錄;protected void userIsEmpty() { String user = (user, null)。 (true)。 } else { (false)。 }}上述代碼放在主界面中,即一進(jìn)入應(yīng)用就進(jìn)行判斷工作,以方便用戶;此外,有登錄功能,肯定也要有相應(yīng)的注銷功能,;().mit()。(false)。可以從代碼中看出,注銷以后需要將權(quán)限恢復(fù)至未注冊(cè)的狀態(tài);同樣地,對(duì)于管理員權(quán)限也是進(jìn)行同樣的判斷,同樣是在主界面中判斷當(dāng)前用戶是否為管理員用戶;此處也存在一個(gè)問題,即“設(shè)置”中的查詢用戶功能可以查看當(dāng)前所有用戶的用戶名與密碼,為了彌補(bǔ)此漏洞,設(shè)計(jì)者將顯示列表中的管理員用戶的密碼設(shè)置為“******”,即防止注冊(cè)用戶看到密碼后用管理員用戶進(jìn)行登錄;管理員用戶應(yīng)該是內(nèi)置的,即程序本身已經(jīng)創(chuàng)建的,而不是通過注冊(cè)界面進(jìn)行創(chuàng)建的,這就需要在啟動(dòng)應(yīng)用時(shí)就創(chuàng)建一個(gè)管理員用戶,并且在其后的啟動(dòng)過程中判斷用戶數(shù)據(jù)庫中是否有此管理員用戶,如果不存在,則創(chuàng)建管理員用戶,且此管理員是固定用戶名和密碼的;private void addAdmin() { ListUser users = ()。 if ((user)) { } else { (user)。 if ((admin)) { (true)。 } else { (false)。 }}第一個(gè)方法放在主界面下,即添加管理員用戶,第二個(gè)方法放在設(shè)置界面,因?yàn)楣芾韱T主要是在設(shè)置中擁有較大的權(quán)限,比如刪除用戶。首先出現(xiàn)的問題是由傳感器采集給出的波形并不精細(xì),本設(shè)計(jì)是采用50Hz的抽樣頻率,以保證波形圖可以手機(jī)終端成功繪出或是及時(shí)保存下數(shù)據(jù)文件,而面對(duì)專業(yè)分析時(shí),這樣的采樣頻率偏低,很難分析出有用的信息;接著是對(duì)于波形周期及其波峰波谷的確定,確定波峰的算法稱為“尋峰算法”,難度較大,資料相對(duì)較少,本設(shè)計(jì)中對(duì)于波形周期的確定是由于傳感器采集到的數(shù)據(jù)起伏較為明顯,且有相對(duì)穩(wěn)定的界限,可以由波形上揚(yáng)一次就判定一個(gè)波峰形成,但這畢竟只適合當(dāng)前的采集的數(shù)據(jù),更可惜的是,除此之外,難以判定其他有用的信息;再次是算法移植問題,在專門的數(shù)值分析軟件如Matlab上可以使用軟件已經(jīng)集成的數(shù)學(xué)函數(shù),但在Java或Android平臺(tái)上并沒有這些方便的函數(shù)可提供使用,且一門語言之所以使用廣泛,是因?yàn)槠淇蓾M足的需求多樣性,并不專注于一個(gè)領(lǐng)域的開發(fā),因而用Java或C寫一個(gè)專門分析數(shù)值的軟件有難度。 總結(jié)此次畢業(yè)設(shè)計(jì),名為“基于Android的便攜式健康監(jiān)測系統(tǒng)”,從技術(shù)上來說,難點(diǎn)在于“基于Android”,即移動(dòng)開發(fā);從內(nèi)容上來說,難點(diǎn)在于“健康監(jiān)測”,即應(yīng)用功能中就具備健康分析與建議模塊。我的工作主要集中在對(duì)軟件應(yīng)用的開發(fā)及調(diào)試上,開發(fā)前期的工作,主要為設(shè)置界面布局,這并不困難,但隨之而來的是應(yīng)用的一個(gè)核心問題:繪圖--不論在哪一種編程語言中,繪圖都不是一件簡單的事情;嘗試過用Java本身自帶的類,效果并不理想,因?yàn)閷?duì)于一個(gè)視覺應(yīng)用,尤其是展示脈搏這樣的屬性,實(shí)時(shí)的波形圖才是最有說服力的,于是難點(diǎn)劃分成三個(gè),先要有圖,然后能成為波形,最后,使其實(shí)時(shí)顯示;經(jīng)過一番查證嘗試,這個(gè)應(yīng)用最大的難題被成功拿下--使用已經(jīng)成熟的繪圖引擎是必要的選擇。后期則是對(duì)應(yīng)用進(jìn)行一些普及的開發(fā),即每個(gè)應(yīng)用一般都有的“注冊(cè)”“設(shè)置”功能,又或是對(duì)脈搏數(shù)據(jù)的一些簡單分析,隨著工作的逐步進(jìn)行,功能漸漸完善,也越來越像一個(gè)真正的應(yīng)用軟件了。參考文獻(xiàn)[1] 王碩,宮恩浩,[J],中國醫(yī)療器械雜志2011,35(6): 402408.[2] 蔡承賢,[J],中國醫(yī)療器械雜志,2010,34(1):13.[3] :醫(yī)療物聯(lián)網(wǎng)潮流先鋒[J],新經(jīng)濟(jì)導(dǎo)刊,:4549.[4] 孟濬,[J],計(jì)算機(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],人民郵電出版社,.附錄一 外文文獻(xiàn)翻譯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