基于android系統(tǒng)手機(jī)通話錄音系統(tǒng)_第1頁(yè)
已閱讀1頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  河北農(nóng)業(yè)大學(xué)</b></p><p>  本科畢業(yè)論文(設(shè)計(jì))</p><p>  題 目: 手機(jī)通話錄音系統(tǒng) </p><p>  學(xué) 院: 信息科學(xué)與技術(shù)學(xué)院 </p><p>  專業(yè)班級(jí): 軟件工程0902班 </

2、p><p>  學(xué) 號(hào): 2009234040225 </p><p>  學(xué)生姓名: 王薇 </p><p>  指導(dǎo)教師姓名: 趙洋 </p><p>  指導(dǎo)教師職稱: 副教授 </p><p>

3、  2013 年 6 月 4 日</p><p><b>  摘要</b></p><p>  現(xiàn)在移動(dòng)設(shè)備呈幾何形增加,移動(dòng)設(shè)備的演化增加了各種移動(dòng)設(shè)備的應(yīng)用程序開(kāi)發(fā),這些移動(dòng)設(shè)備可以成為承載WEB服務(wù)的客戶端,移動(dòng)的硬件和軟件平臺(tái)形式允許更快和更豐富的應(yīng)用程序的運(yùn)行。本文所介紹的通話錄音系統(tǒng)趨于國(guó)際化也被越來(lái)越多的人接受 ,自2000年以來(lái),全國(guó)手機(jī)基本上普遍都具

4、有通話錄音功能,可將短暫通話記錄下來(lái),一般作為法庭重要政務(wù)和不可輕視的證據(jù),也可適當(dāng)看做娛樂(lè)。手機(jī)錄音直接就可以保存在手機(jī)SD卡上,需要的時(shí)候可以直接調(diào)出來(lái),很方便。</p><p>  因?yàn)槟壳笆謾C(jī)市場(chǎng)已經(jīng)出現(xiàn)了明顯的Android一家獨(dú)大趨勢(shì),所以本系統(tǒng)選擇了Android平臺(tái)進(jìn)行開(kāi)發(fā)。本論文首先給出了課題的研究背景,對(duì)Android平臺(tái)做了簡(jiǎn)單的介紹,通過(guò)介紹,可以讓讀者了解其平臺(tái)的基本框架以及基本的平臺(tái)開(kāi)

5、發(fā)技術(shù),在此基礎(chǔ)上分析了手機(jī)通話錄音系統(tǒng)Android客戶端程序的基本架構(gòu)以及各個(gè)模塊的解決方案,實(shí)現(xiàn)通話錄音的打開(kāi)、關(guān)閉、播放、刪除、保存、選擇格式等功能。</p><p>  關(guān)鍵字:移動(dòng)設(shè)備、通話錄音系統(tǒng)、Android</p><p><b>  Abstract</b></p><p>  Now the mobile device

6、is geometric increase, evolution of mobile devices increase the application development of various mobile devices, these devices can be hosting the WEB service client, allowing faster and more extensive application of mo

7、bile hardware and software platform running .Call recording system described in this article to be internationalization is accepted by more and more people, since 2000, the national mobile phone basically universal has c

8、all recording function, can be recorde</p><p>  Because the mobile phone market has appeared obvious Android alone big trend, so the system selected Android development platform. This paper first presents th

9、e research background of the subject, the Android platform is introduced, through the introduction, so that readers can understand the basic framework of the platform as well as the basic platform development technology,

10、 based on the analysis of the basic architecture of mobile phone call recording system Android client program and each mo</p><p>  Keywords: mobile equipment, call recording system, Android </p><p

11、><b>  目 錄</b></p><p><b>  1.緒論1</b></p><p><b>  1.1研究背景1</b></p><p>  1.2研究概況與發(fā)展趨勢(shì)1</p><p><b>  2.需求分析1</b><

12、;/p><p>  2.1可行性分析1</p><p>  2.1.1操作可行性1</p><p>  2.1.2技術(shù)可行性1</p><p>  2.1.3經(jīng)濟(jì)可行性2</p><p>  2.2功能需求分析2</p><p>  2.2.1基本功能需求2</p><

13、;p>  2.2.2用戶界面需求2</p><p>  3.開(kāi)發(fā)環(huán)境和開(kāi)發(fā)技術(shù)2</p><p>  3.1Android平臺(tái)介紹2</p><p>  3.2Android基本框架介紹3</p><p>  3.3開(kāi)發(fā)環(huán)境的選擇4</p><p>  4.Android手機(jī)客戶端具體功能分析4<

14、;/p><p><b>  4.1主界面4</b></p><p>  4.2錄音文件的保存4</p><p>  4.3開(kāi)機(jī)自啟動(dòng)的設(shè)置9</p><p>  4.4錄音文件的管理9</p><p>  4.5功能的開(kāi)啟和關(guān)閉10</p><p>  4.6錄音文件

15、格式的選擇11</p><p>  5.關(guān)鍵程序設(shè)計(jì)11</p><p><b>  6總結(jié)12</b></p><p><b>  致謝12</b></p><p><b>  附圖13</b></p><p><b>  參考文獻(xiàn)

16、14</b></p><p><b>  1.緒論</b></p><p><b>  1.1研究背景</b></p><p>  在日常生活或其它方方面面,都經(jīng)常會(huì)遇到這樣的問(wèn)題,交流雙方或者對(duì)接雙方在通過(guò)電話溝通交流的時(shí)候,由于無(wú)法做到面面,所以所說(shuō)的話,經(jīng)常會(huì)發(fā)生歧義造成雙方發(fā)生誤解,尤其是在企業(yè)管理中

17、,一般要記錄下電話中的重要信息,傳統(tǒng)的通話資料大部分都是在通話結(jié)束后,通話者再回憶一遍通話的內(nèi)容,然后慢慢的記錄下來(lái),這種方式古老而落后,通話錄音軟件的出現(xiàn),真正改變了這種模式。這樣的資料保存方式,詳細(xì)全面而準(zhǔn)確,沒(méi)有半點(diǎn)耽誤,非常的方便。  </p><p>  而且它也是作為法庭重要政務(wù)和不可輕視的證據(jù),也會(huì)被人們適當(dāng)看做娛樂(lè)。</p><p>  1.2研究概況與

18、發(fā)展趨勢(shì)</p><p>  通話錄音軟件最主要的作用是,把通話信息固化,形成數(shù)字化資料保存在手機(jī)內(nèi)存里,是個(gè)人記錄重要通話信息的便捷手段,也可以作為娛樂(lè)使用。隨著通信和互聯(lián)網(wǎng)技術(shù)的發(fā)展,當(dāng)前通話錄音軟件的功能又有了新的發(fā)展。除了iphone不能實(shí)現(xiàn)通話錄音軟件的開(kāi)發(fā)外,大部分手機(jī)系統(tǒng)都具有相應(yīng)的通話錄音軟件,可實(shí)現(xiàn)雙向通話錄音,錄音時(shí)間不再受時(shí)間限制。 </p><p>  如今,手機(jī)通

19、話錄音軟件是智能手機(jī)發(fā)展起來(lái)后的新寵,是移動(dòng)互聯(lián)網(wǎng)技術(shù)的新型應(yīng)用。尤其是錄音文件被列入證據(jù)范疇以后,通話錄音成為非常廣泛的需求。近來(lái),在云存儲(chǔ)技術(shù)發(fā)展的促進(jìn)之下,出現(xiàn)了一些與存證、公證相結(jié)合的新型通話錄音軟件,比如語(yǔ)音實(shí)錄通話錄音軟件、存證寶等 ,語(yǔ)音實(shí)錄通話錄音軟件是其中最以技術(shù)見(jiàn)長(zhǎng)的針對(duì)安卓手機(jī)開(kāi)發(fā)的軟件,在所有安卓通話錄音軟件中內(nèi)錄功能最強(qiáng),已經(jīng)可以支持四十款左右的安卓手機(jī)實(shí)現(xiàn)內(nèi)錄,雙向通話錄音屬于高清標(biāo)準(zhǔn)。 </p>

20、<p>  隨著這方面需求的不斷增大,我們要不斷注入新的功能,所以,軟件通話錄音系統(tǒng)必須保持進(jìn)步與完善。</p><p><b>  2.需求分析</b></p><p><b>  2.1可行性分析</b></p><p>  2.1.1操作可行性</p><p>  本系統(tǒng)操作簡(jiǎn)單

21、,易于理解,只需通過(guò)簡(jiǎn)單指導(dǎo),上手較快。尊重用戶習(xí)慣,不改變常規(guī)電話接聽(tīng)模式,方便易用,可隨時(shí)通話錄音。 </p><p>  2.1.2技術(shù)可行性</p><p>  Android平臺(tái)是一個(gè)開(kāi)放式的平臺(tái),國(guó)內(nèi)開(kāi)發(fā)人員眾多,網(wǎng)上相關(guān)資料豐富,同時(shí)在網(wǎng)上或書店都能買到各類有關(guān)Android平臺(tái)技術(shù)開(kāi)發(fā)的圖書,因此Android手機(jī)客戶端的開(kāi)發(fā)在技術(shù)方面已不是問(wèn)題。</p>&

22、lt;p>  2.1.3經(jīng)濟(jì)可行性</p><p>  該項(xiàng)目相比而言總體規(guī)模不大,開(kāi)發(fā)周期比較短,且投入成本較少,并且目前Android手機(jī)越來(lái)越普遍,客戶端成本非常低廉,易于管理和維護(hù)。因此在成本上不是問(wèn)題。</p><p><b>  2.2功能需求分析</b></p><p>  2.2.1基本功能需求</p>&l

23、t;p>  表2-2-1 功能描述</p><p>  2.2.2用戶界面需求</p><p><b> ?。ㄒ?jiàn)附圖)</b></p><p>  3.開(kāi)發(fā)環(huán)境和開(kāi)發(fā)技術(shù)</p><p>  3.1 Android平臺(tái)介紹</p><p>  無(wú)論對(duì)于生產(chǎn)Android軟件,還是硬件的企業(yè)來(lái)

24、說(shuō),它都是免費(fèi)的 [3]。對(duì)于軟件廠商來(lái)說(shuō),加入Google的Android聯(lián)盟之后就可以對(duì)Android系統(tǒng)進(jìn)行更改,從而在Android框架下打造出自己的操作系統(tǒng),我國(guó)就有聯(lián)想、華為、中興、播思通訊等企業(yè)加入了Android聯(lián)盟,并且打造出樂(lè)phone,Ophone等一系列就有自主知識(shí)產(chǎn)權(quán)的手機(jī)操作系統(tǒng),目前國(guó)家工信部和移動(dòng)在大力推廣這些手機(jī)操作系統(tǒng)。相對(duì)于蘋果公司、微軟公司的“閉關(guān)鎖國(guó)”政策,Android的策略是正好相反的,那就

25、是Open,完全開(kāi)放,無(wú)論是系統(tǒng)內(nèi)使用的框架,OpenGL、OpenCore等都是開(kāi)源組織在維護(hù),還是Android系統(tǒng)本身的源代碼都是完全開(kāi)放的,任何人都可以使用Google公司的GIT賬號(hào)去內(nèi)部的服務(wù)器上去直接下載源碼。這些舉措得到了很多組織和個(gè)人的支持。對(duì)于硬件廠商來(lái)說(shuō),在自己的硬件產(chǎn)品上安裝Android操作系統(tǒng)只需要遵循Google的規(guī)范,是不需要額外像其支付任何費(fèi)用的,相信在不久的將來(lái)Android系統(tǒng)將會(huì)被大量的手機(jī)、平板

26、電腦,電視機(jī)頂盒,學(xué)習(xí)機(jī)等移動(dòng)終端上面所使用,市場(chǎng)份額將會(huì)非常大,甚至有</p><p>  對(duì)于Android開(kāi)發(fā)者來(lái)說(shuō),學(xué)習(xí)這個(gè)系統(tǒng)的開(kāi)發(fā)是非常容易上手的,它的開(kāi)發(fā)主要由Java語(yǔ)言為主,并且Google提供了基于Eclipse 的開(kāi)發(fā)環(huán)境(IDE),免費(fèi)、跨平臺(tái)(Windows、Mac OS X、Linux) 的開(kāi)發(fā)工具(SDK),能夠非常方便的進(jìn)行配置,基于眾多的Java程序員,想必Android程序員的

27、基數(shù)也會(huì)非常的大,無(wú)疑這也會(huì)推動(dòng)Android的進(jìn)一步發(fā)展。</p><p>  3.2Android基本框架介紹</p><p>  圖3-2 Android基本框架</p><p>  從圖中可以看出,Android系統(tǒng)架構(gòu)為四層結(jié)構(gòu),從上層到下層依次是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層以及Linux內(nèi)核層。</p><p>  應(yīng)

28、用程序?qū)?,我們?cè)趀clipse里面利用SDK開(kāi)發(fā)出來(lái)的程序就運(yùn)行在這一層中,的這些應(yīng)用程序都是用Java語(yǔ)言編寫的,并且這些應(yīng)用程序的被安裝和卸載,就連Android系統(tǒng)自帶的應(yīng)用程序,我們也可以將他們替換,只需將程序放到Android對(duì)應(yīng)linux系統(tǒng)的system/app路徑下,就可以輕松替換系統(tǒng)原生的應(yīng)用,但這個(gè)操作需要ROOT權(quán)限,普通用戶權(quán)限不能完成這個(gè)操作。</p><p>  應(yīng)用程序框架層,這一層

29、是普通Android開(kāi)發(fā)的基礎(chǔ),我們?cè)趹?yīng)用程序框架層調(diào)用的函數(shù)大多來(lái)源于這一層,這一層主要包括ActivityManager、WindowManager、ContentProvider等類,這些都是與系統(tǒng)息息相關(guān)的類,系統(tǒng)控制Activity、界面的顯示、消息的提醒等就是調(diào)用這一層的程序。</p><p>  系統(tǒng)運(yùn)行庫(kù)層從圖中可以看出,這一層也可以叫做C\C++層,因?yàn)檫@一層的代碼都是由C和C++語(yǔ)言進(jìn)行編寫的

30、,然后應(yīng)用層和框架層可以通過(guò)JNI的方式來(lái)進(jìn)行調(diào)用這一層的程序。這一層主要是SQLITE,OPENGL等偏底層的組件。</p><p>  Linux內(nèi)核層,最底層就是Android的改編原型Linux,它是基于Linux2.6內(nèi)核,系統(tǒng)與硬件的驅(qū)動(dòng)等都依賴于Linux內(nèi)核。</p><p>  就是以上四層構(gòu)成了Android系統(tǒng),這四層相互緊密聯(lián)系,又相對(duì)獨(dú)立,便于系統(tǒng)的維護(hù)以及新功能

31、的增加。</p><p>  3.3開(kāi)發(fā)環(huán)境的選擇</p><p>  開(kāi)發(fā)與運(yùn)行的環(huán)境的選擇會(huì)影響到數(shù)據(jù)庫(kù)設(shè)計(jì),本系統(tǒng)開(kāi)發(fā)與運(yùn)行環(huán)境如下:</p><p>  此次研究使用eclipse作為開(kāi)發(fā)工具,使用java開(kāi)發(fā)環(huán)境JDK和android開(kāi)發(fā)環(huán)境AndroidSDK,使用JAVA語(yǔ)言進(jìn)行程序的開(kāi)發(fā)。</p><p>  4. Andro

32、id手機(jī)客戶端具體功能分析</p><p><b>  4.1主界面</b></p><p>  此程序的主界面使用了android原生的PreferenceActivity,與android自帶程序Setting的風(fēng)格保持一直。從名字應(yīng)該可以看出 其實(shí) Activity 與 Perference 的混合物 ,因?yàn)橹皇谴鎯?chǔ)用戶的一些簡(jiǎn)單配置文件值,而Shar

33、edPreferences正好可以滿足Preference的鍵值對(duì)存儲(chǔ)。所以用戶配置界面PreferenceActivity,就是使用SharedPreferneces以鍵值對(duì)的形式進(jìn)行保存用戶配置文件的,當(dāng)然,既然是使用SharedPreferences保存數(shù)據(jù),所有的一切關(guān)于SharedPreferences的性質(zhì)我們都可以用得到,比如配置更改存儲(chǔ)、數(shù)據(jù)變化監(jiān)聽(tīng)等,PreferenceActivity的Preference在這里就是

34、指的是SharedPreferences,而PreferenceActivity的Activity則是指其又可以像Activity一樣展示出來(lái)??傃灾?,PreferenceActivity就是能夠使用SharedPreferneces保存的數(shù)據(jù)的Activity。</p><p>  這種布局方式正好符合這種錄音小程序?qū)τ脩舨僮鬟M(jìn)行記錄和保存。用法也非常簡(jiǎn)單,只需要在XML文件里面定義好你所需要的checkbox

35、,button等組鍵,定義時(shí)可以加上Intent屬性。它會(huì)自動(dòng)監(jiān)聽(tīng)用戶的動(dòng)作,用來(lái)執(zhí)行跳轉(zhuǎn)頁(yè)面等操作。當(dāng)然在主程序的onCreate時(shí)要執(zhí)行this.addPreferencesFromResource(R.xml.mainpreference)此函數(shù),用來(lái)將界面布局和程序結(jié)合在一起。</p><p>  此程序里面主要涉及到了錄音列表,錄音類型,開(kāi)啟電話錄音功能開(kāi)關(guān),開(kāi)機(jī)自動(dòng)啟動(dòng)的的布局。</p>

36、<p>  4.2錄音文件的保存</p><p>  實(shí)現(xiàn)保存錄音的功能,主要用到了Android的MediaRecorder,MediaRecorder具有復(fù)雜的生命周期,可以用來(lái)錄制音頻或視頻。它具有以下幾個(gè)狀態(tài):</p><p>  Initial :初始狀態(tài),在設(shè)定視頻源或者音頻源之后將轉(zhuǎn)換為Initialized 狀態(tài)。</p>&l

37、t;p>  Initialized :已初始化狀態(tài),可以通過(guò)設(shè)置輸出格式轉(zhuǎn)換為DataSourceConfigured 狀態(tài),或者通過(guò)重新啟動(dòng)轉(zhuǎn)換成Initial 狀態(tài)。</p><p>  DataSourceConfigured :數(shù)據(jù)源配置狀態(tài),這期間可以設(shè)定編碼方式、輸出文件、屏幕旋轉(zhuǎn)、預(yù)覽顯示等等。它仍然可以通過(guò)從新啟動(dòng)回到Initial 狀態(tài),或

38、者通過(guò)就緒到達(dá)Prepared 狀態(tài)。</p><p>  Prepared :就緒狀態(tài),在就緒狀態(tài)仍然可以通過(guò)重新啟動(dòng)方法回到Initialized 狀態(tài)?;蛘咄ㄟ^(guò)start 方法進(jìn)入錄制狀態(tài)。</p><p>  Recording :錄制狀態(tài),真正在錄音的那個(gè)狀態(tài),前邊做的一切都是鋪墊,它可以通過(guò)停止或者重新啟動(dòng)回到Initial&#

39、160;狀態(tài)。</p><p>  Released :釋放狀態(tài)(官方文檔給出的詞叫做 Idle state 空閑狀態(tài),而官方的圖卻不這么寫),Initial 狀態(tài)可以通過(guò)調(diào)用釋放方法來(lái)進(jìn)入這個(gè)狀態(tài),這時(shí)將會(huì)釋放所有和MediaRecorder 對(duì)象綁定的資源。</p><p>  Error :錯(cuò)誤狀態(tài),當(dāng)錯(cuò)誤發(fā)生的時(shí)候進(jìn)入這個(gè)

40、狀態(tài),它可以通過(guò)從新啟動(dòng)進(jìn)入Initial 狀態(tài)。</p><p>  下圖為MediaRecorder從初始化到結(jié)束的整個(gè)流程圖:</p><p>  圖4-2 MediaRecorder流程圖</p><p>  但是如果直接使用的話發(fā)現(xiàn)跟我們的主要功能不是很匹配,為了方便使用,最好是將其進(jìn)行封裝,本程序中就將MediaRecorder封裝成了Phon

41、eRecorder類,下面列出主要的方法:</p><p>  public File getFile(){</p><p>  File base = null;</p><p>  String root = Environment.getExternalStorageDirectory().getPath();</p><p><

42、b>  //創(chuàng)建文件夾</b></p><p>  base = new File(root + DEFAULT_STORE_SUBDIR);</p><p>  if (!base.isDirectory() && !base.mkdir()){</p><p>  Log.e(TAG, "getFile--Can

43、9;t create base dir.");</p><p>  return null;</p><p><b>  }</b></p><p><b>  //設(shè)置文件名格式</b></p><p>  SimpleDateFormat sdf = new SimpleDateFo

44、rmat("'phone'-yyyyMMddHHmmss-" + PhoneReceiver.mNumber);</p><p>  String fn = sdf.format(new Date());</p><p>  fn = base.getPath() + File.separator + fn + DEFAULT_RECORD_SUFFIX

45、;</p><p>  Log.d(TAG, "getFile is filepath is " + fn);</p><p>  //檢驗(yàn)空間是否足夠大</p><p>  StatFs stat = null;</p><p>  stat = new StatFs(base.getPath());</p>

46、<p>  long available_size = ((long)stat.getAvailableBlocks() -4) * stat.getBlockSize();</p><p>  if (available_size < MINIMUM_FREE_SIZE){</p><p>  Log.e(TAG, "getFile--not enough

47、free space.");</p><p>  return null;</p><p><b>  }</b></p><p><b>  //建立文件</b></p><p>  File outFile = new File(fn);</p><p><

48、;b>  try{</b></p><p>  if (outFile.exists()){</p><p>  outFile.delete();</p><p><b>  }</b></p><p>  boolean bRect = outFile.createNewFile();</p&

49、gt;<p>  if (!bRect){</p><p>  Log.e(TAG, "getRecordFile, fn:" + fn);</p><p><b>  }</b></p><p>  }catch (Exception e){</p><p>  e.printStac

50、kTrace();</p><p>  return null;</p><p><b>  }</b></p><p>  Log.d(TAG, "getFile sucess..");</p><p>  return outFile;</p><p><b> 

51、 }</b></p><p>  此函數(shù)是用來(lái)創(chuàng)建一個(gè)空文件來(lái)供存儲(chǔ)錄音的音頻。</p><p>  public boolean startRecord(int OutputFormate, String extension, Context context){</p><p>  Log.d(TAG, "satrtReocrd...&quo

52、t;);</p><p>  if (mState != IDLE_STATE){</p><p>  Log.d(TAG, "startRecord error mState != IDLE_STATE");</p><p>  return false;</p><p><b>  }</b>&l

53、t;/p><p>  stopRecord();</p><p>  mFile = getFile();</p><p>  if (mFile == null){</p><p>  Log.d(TAG, "startRecord error mFile == null");</p><p>  r

54、eturn false;</p><p><b>  }</b></p><p>  //初始化mediaRecorder</p><p>  //TODO set這些值的順序能否變化?</p><p>  mRecorder = new MediaRecorder();</p><p>  mR

55、ecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);</p><p>  mRecorder.setOutputFormat(OutputFormate);</p><p>  mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);</p>

56、<p>  mRecorder.setOutputFile(mFile.getAbsolutePath());</p><p>  //mediaRecorder prepare, 一定要handle住 IOException</p><p><b>  try {</b></p><p>  mRecorder.prepare()

57、;</p><p>  }catch (IOException e) {</p><p>  mRecorder.reset();</p><p>  mRecorder.release();</p><p>  mRecorder = null;</p><p>  e.printStackTrace();</

58、p><p>  return false;</p><p><b>  }</b></p><p><b>  //開(kāi)始錄音</b></p><p><b>  try{</b></p><p>  mRecorder.start();</p>

59、<p>  } catch (RuntimeException e){</p><p>  mRecorder.reset();</p><p>  mRecorder.release();</p><p>  mRecorder = null;</p><p>  e.printStackTrace();</p>

60、<p>  return false;</p><p><b>  }</b></p><p>  //將狀態(tài)設(shè)置為錄音狀態(tài)</p><p>  setState(RECORDING_STATE);</p><p>  Log.d(TAG, "satrtReocrd... success")

61、;</p><p>  return true;</p><p><b>  }</b></p><p>  此函數(shù)是封裝的開(kāi)始錄音函數(shù),將MediaRecorder復(fù)雜的init,prepare等初始化過(guò)程封裝在了一個(gè)函數(shù)中,方便業(yè)務(wù)邏輯調(diào)用。</p><p>  public void stopRecord(){&l

62、t;/p><p>  Log.d(TAG, "stopRecord... ");</p><p>  if(mRecorder == null){</p><p>  Log.d(TAG, "Stop Recording error.....mRecord == null");</p><p><b&

63、gt;  return;</b></p><p><b>  }</b></p><p><b>  //暫停錄音</b></p><p><b>  try{</b></p><p>  mRecorder.stop();</p><p>

64、  } catch (RuntimeException e){</p><p>  Log.d(TAG, "Stop Recording error.....RuntimeException");</p><p>  mRecorder.reset();</p><p>  e.printStackTrace();</p><

65、p><b>  }</b></p><p>  mRecorder.release();</p><p>  mRecorder = null;</p><p>  setState(IDLE_STATE);</p><p>  //將數(shù)據(jù)插入數(shù)據(jù)庫(kù)</p><p>  if (mFile.

66、getPath() != null) {</p><p>  ContentResolver cr = mContext.getContentResolver();</p><p>  ContentValues values = new ContentValues();</p><p>  values.put(MediaStore.Audio.Media.DAT

67、A, mFile.getPath());</p><p>  String title = mFile.getName();</p><p>  if (title.contains(DEFAULT_RECORD_SUFFIX)) {</p><p>  Log.d(TAG, "title.contains(DEFAULT_RECORD_SUFFIX) &

68、quot;);</p><p>  title = title.replace(DEFAULT_RECORD_SUFFIX, "");</p><p><b>  }</b></p><p>  Log.d(TAG, "title is " + title);</p><p>  

69、values.put(MediaStore.Audio.Media.TITLE, title);</p><p>  values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mp4");</p><p>  Uri uri = cr.insert(MediaStore.Audio.Media.EXTERNAL_CONTEN

70、T_URI,</p><p><b>  values);</b></p><p>  Log.d(TAG, "uri is " + uri);</p><p>  Intent intent_scanFile = new Intent(</p><p>  Intent.ACTION_MEDIA_S

71、CANNER_SCAN_FILE, uri);</p><p>  mContext.sendBroadcast(intent_scanFile);</p><p>  Log.d(TAG, "sendBroadcast..........");</p><p><b>  }</b></p><p>

72、;  Log.d(TAG, "stopRecord... success");</p><p><b>  }</b></p><p>  此函數(shù)是將暫停錄音,保存錄音文件、插入數(shù)據(jù)庫(kù)、發(fā)送廣播來(lái)掃描錄制的此文件封裝到了一起。</p><p>  在主線程中只需調(diào)用這三個(gè)函數(shù)即可完成錄音文件的創(chuàng)建和保存,大大優(yōu)化了效率,以及

73、代碼的復(fù)用性。</p><p>  4.3開(kāi)機(jī)自啟動(dòng)的設(shè)置</p><p>  Android 系統(tǒng)啟動(dòng)的時(shí)候,首先會(huì)進(jìn)行一些諸如硬件自檢之類的操作,這些操作完成以后(至少它應(yīng)該知道當(dāng)前的機(jī)器有沒(méi)有電),會(huì)檢查一下當(dāng)前手機(jī)按鍵的狀態(tài)(接下來(lái) 就是所謂刷機(jī)模式切換了,不同的android手機(jī)有不同的按鍵組合用來(lái)進(jìn)入刷機(jī)模式),如果此時(shí)按鍵狀態(tài)處于刷機(jī)組合,那么系統(tǒng)會(huì)調(diào)用R

74、OM里面的一個(gè)叫做recovery的程序;如果此時(shí)按鍵沒(méi)有標(biāo)明是刷機(jī)模式,那么系統(tǒng)會(huì)創(chuàng)建內(nèi)存盤,開(kāi)始從ROM里面載入相應(yīng)的文件系統(tǒng),并把相關(guān)的文件拷貝到內(nèi)存盤中,進(jìn)而引導(dǎo) linux啟動(dòng),然后是啟動(dòng)虛擬機(jī)dalvik,然后就是創(chuàng)建工作進(jìn)程載入和運(yùn)行framework,然后就會(huì)看到待機(jī)的畫面。當(dāng)然在這個(gè)過(guò)程中還發(fā)生了許多事情,啟動(dòng)了許多服務(wù),我們就利用他啟動(dòng)Framework層和加載所有應(yīng)用程序之后,發(fā)送BOOT_COMPLET

75、ED 廣播消息,就好像告訴所有的應(yīng)用程序手機(jī)啟動(dòng)起來(lái)了。</p><p>  BroadcastReceiver(廣播接收器)是Android中的四大組件之一。此程序就是利用BroadcastReceiver來(lái)接受BOOT_COMPLETED消息,然后就開(kāi)始監(jiān)聽(tīng)用戶的電話狀態(tài)。</p><p>  public void onReceive(Context context, Intent

76、intent) {</p><p>  Log.d(TAG, "action" + intent.getAction());</p><p>  mContext = context;</p><p>  Log.d(TAG ,"flag is " + flag);</p><p>  if (inte

77、nt.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){</p><p>  SharedPreferences prefs = context.getSharedPreferences("com.android.work_preferences", 0);</p><p>  boolean boot_turn_on

78、= prefs.getBoolean("BootTurnOn", false);</p><p>  boolean turn_on = prefs.getBoolean("isTurnOn", false);</p><p>  //開(kāi)機(jī)自啟動(dòng)關(guān)閉,錄音功能開(kāi)啟 ,關(guān)閉錄音</p><p>  if (!boot_turn_

79、on && turn_on){</p><p>  flag = STATE_CLOSE;</p><p>  prefs.edit().putBoolean("isTurnOn", false).commit();</p><p>  } else if(boot_turn_on && turn_on){<

80、/p><p>  flag = STATE_OPEN;</p><p>  } else if(boot_turn_on && !turn_on){</p><p>  flag = STATE_OPEN;</p><p>  prefs.edit().putBoolean("isTurnOn", true

81、).commit();</p><p><b>  }</b></p><p><b>  }</b></p><p>  這樣就實(shí)現(xiàn)了開(kāi)機(jī)自啟動(dòng)的功能。</p><p>  4.4錄音文件的管理</p><p>  在此程序中實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的文件管理器,利用ListActi

82、vity的布局方式,將已經(jīng)錄下的錄音文件按照時(shí)間順序進(jìn)行排列。</p><p>  該界面里面的數(shù)據(jù)一個(gè)像數(shù)組或者是光標(biāo)一樣,通過(guò)綁定數(shù)據(jù)資源來(lái)陳列一系列選項(xiàng)的活動(dòng)。當(dāng)我們選擇這些選項(xiàng)時(shí),將會(huì)觸發(fā)一個(gè)事件。ListActivity主持操作著一個(gè)列表視圖對(duì)象,這個(gè)列表視圖能綁定不同的數(shù)據(jù)資源,典型的就是一個(gè)持有查詢結(jié)果的數(shù)組或者是光標(biāo)。ListActivity有一個(gè)默認(rèn)的布局,這個(gè)布局由單一的、全屏列表構(gòu)成。我們通

83、過(guò)在onCreate()中使用setContentView()設(shè)置自己的視圖布局來(lái)定制自己的屏幕布局。如果要完成這些,我們自己的視圖必須包含一個(gè)id為“@android:id/list”的ListView對(duì)象。如果我們的列表為空時(shí),可以包含另外一個(gè)視圖對(duì)象,這個(gè)空的列表必須有一個(gè)"android:empty"值的id,注意到當(dāng)有一個(gè)空的視圖顯示時(shí),這個(gè)列表視圖將會(huì)在沒(méi)有任何數(shù)據(jù)時(shí)被隱藏。</p><

84、;p>  簡(jiǎn)單的說(shuō)就是首先將數(shù)據(jù)放到一個(gè)Adapter中,然后listActivity會(huì)自動(dòng)的將數(shù)據(jù)按照線性進(jìn)行排列,給用戶一種簡(jiǎn)單,嚴(yán)謹(jǐn)?shù)捏w驗(yàn)。</p><p>  在此界面也實(shí)現(xiàn)了用戶對(duì)錄音文件的簡(jiǎn)單管理,如刪除等操作。文件名的選擇是根據(jù)跟你通話人的電話號(hào)碼,在通訊錄數(shù)據(jù)庫(kù)中自動(dòng)索引此人名字并且顯示出來(lái),如果索引不到,就會(huì)以電話號(hào)碼作為此文件的顯示名稱,讓用戶一目了然,非??焖俚恼业阶约合胍匿浺粑募?。

85、</p><p>  4.5功能的開(kāi)啟和關(guān)閉</p><p>  此功能利用sharedPreference來(lái)進(jìn)行保存開(kāi)啟和關(guān)閉的狀態(tài)。</p><p>  SharedPreferences是Android平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類,主要是保存一些常用的配置比如窗口狀態(tài),一般在Activity中 重載窗口狀態(tài)onSaveInstanceState保存一般使用Shar

86、edPreferences完成,它提供了Android平臺(tái)常規(guī)的Long長(zhǎng) 整形、Int整形、String字符串型的保存。</p><p>  在Android系統(tǒng)中,在主界面有一個(gè)checkbox用戶來(lái)進(jìn)行對(duì)電話錄音功能的開(kāi)啟和關(guān)閉。當(dāng)用戶點(diǎn)擊,程序會(huì)監(jiān)聽(tīng)用戶的點(diǎn)擊事件,從而調(diào)用此函數(shù):</p><p>  public boolean onPreferenceChange(Prefer

87、ence preference, Object newValue) {</p><p>  Log.d(TAG, "preference.key is " + preference.getKey() + " newValue is "</p><p>  + newValue.toString());</p><p>  if

88、 (preference.getKey().equals("isTurnOn")) {</p><p>  if (newValue.toString().equals("true")) {</p><p>  //PhoneReceiver.setFlag(PhoneReceiver.STATE_OPEN);</p><

89、p>  } else if (newValue.toString().equals("false")) {</p><p>  //PhoneReceiver.setFlag(PhoneReceiver.STATE_CLOSE);</p><p>  Intent intent = new Intent("com.phonereceiver.st

90、ate.close");</p><p>  this.sendBroadcast(intent);</p><p>  Log.d(TAG, "sendBroadcast com.phonereceiver.state.close....");</p><p>  //設(shè)置將連接狀態(tài)置為false</p><

91、p>  SharedPreferences prefs = this.getSharedPreferences("com.android.phone.record.master_preferences", 0);</p><p>  prefs.edit().putBoolean(STRING_CONNECT_STATE, false).commit();</p><

92、p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p><p>  修改SharedPreferences中的的標(biāo)志位,來(lái)對(duì)開(kāi)啟和關(guān)閉錄音進(jìn)行操作。</p><p>  4.6錄音文件格式的選擇</p><p

93、>  錄音文件格式的保存實(shí)現(xiàn)方法與上面錄音功能開(kāi)啟和關(guān)閉的方法相同,Mediarecorder初始化時(shí),可以進(jìn)行MediaRecorder.OutputFormat的設(shè)置,我們程序里面使用了最常見(jiàn)的3gpp和AMR格式,來(lái)供用戶進(jìn)行選擇。當(dāng)然跟上面相同,通過(guò)修改SharedPreferences中的的key-value鍵值對(duì)來(lái)進(jìn)行保存,當(dāng)初始化時(shí),會(huì)從SharedPreferences中得到此數(shù)據(jù)。</p><

94、p><b>  5.關(guān)鍵程序設(shè)計(jì)</b></p><p>  下面進(jìn)行此程序的關(guān)鍵設(shè)計(jì),就是如何監(jiān)聽(tīng)電話的呼入和呼出狀態(tài)。開(kāi)發(fā)應(yīng)用程序的時(shí)候,我們希望能夠監(jiān)聽(tīng)電話的呼入,以便執(zhí)行暫停音樂(lè)播放器等操作,當(dāng)電話結(jié)束之后,再次恢復(fù)播放。在Android平臺(tái)可以通過(guò)TelephonyManager和PhoneStateListener來(lái)完成此任務(wù)。</p><p>  

95、TelephonyManager作為一個(gè)Service接口提供給用戶查詢電話相關(guān)的內(nèi)容,比如IMEI,LineNumber1。通過(guò)下面的代碼即可獲得TelephonyManager的實(shí)例。TelephonyManager mTelephonyMgr = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);</p><p>  在A

96、ndroid平臺(tái)中,PhoneStateListener是個(gè)很有用的監(jiān)聽(tīng)器,用來(lái)監(jiān)聽(tīng)電話的狀態(tài),比如呼叫狀態(tài)和連接服務(wù)等。其方法如下所示:</p><p>  public void onCallForwardingIndicatorChanged(boolean cfi)</p><p>  public void onCallStateChanged(int state, String

97、 incomingNumber)</p><p>  public void onCellLocationChanged(CellLocation location)</p><p>  public void onDataActivity(int direction)</p><p>  public void onDataConnectionStateChang

98、ed(int state)</p><p>  public void onMessageWaitingIndicatorChanged(boolean mwi)</p><p>  public void onServiceStateChanged(ServiceState serviceState)</p><p>  public void onSignalS

99、trengthChanged(int asu)</p><p>  這里我們只需要覆蓋onCallStateChanged()方法即可監(jiān)聽(tīng)呼叫狀態(tài)。在TelephonyManager中定義了三種狀態(tài),分別是振鈴(RINGING),摘機(jī)(OFFHOOK)和空閑(IDLE),我們通過(guò)state的值就知道現(xiàn)在的電話狀態(tài)了。</p><p>  獲得了TelephonyManager接口之后,調(diào)用

100、listen()方法即可監(jiān)聽(tīng)電話狀態(tài)。</p><p>  也就是說(shuō)當(dāng)用PhoneStateListener來(lái)監(jiān)聽(tīng)用戶的來(lái)電和去電狀態(tài),來(lái)調(diào)用之前封裝好的startRecord和stopRecord 函數(shù)來(lái)進(jìn)行錄音和停止。</p><p><b>  具體代碼如下:</b></p><p>  private PhoneStateLi

101、stener listener = new PhoneStateListener() {</p><p><b>  @Override</b></p><p>  public void onCallStateChanged(int state, String incomingNumber) {</p><p>  // 注意,方法必須寫在s

102、uper方法后面,否則incomingNumber無(wú)法獲取到值。</p><p>  super.onCallStateChanged(state, incomingNumber);</p><p>  switch (state) {</p><p>  case TelephonyManager.CALL_STATE_IDLE:</p><p

103、>  Log.d(TAG, "掛斷");</p><p>  if (mRecorder != null){</p><p>  mRecorder.stopRecord();</p><p><b>  }</b></p><p>  setToCloseState();</p>

104、<p><b>  break;</b></p><p>  case TelephonyManager.CALL_STATE_OFFHOOK:</p><p>  Log.d(TAG, "接聽(tīng)");</p><p>  if (mRecorder != null && flag==STATE_C

105、ONNECT){</p><p>  Log.d(TAG, "startRecord.......");</p><p>  mRecorder.startRecord(RECORD_OUTPUT_FORMATE, RECORD_TYPE, mContext);</p><p><b>  }</b></p>

106、<p><b>  break;</b></p><p>  case TelephonyManager.CALL_STATE_RINGING:</p><p>  Log.d(TAG, "響鈴:來(lái)電號(hào)碼" + incomingNumber);</p><p>  mNumber = incomingNumber;

107、</p><p><b>  // 輸出來(lái)電號(hào)碼</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  };&

108、lt;/b></p><p>  這樣就實(shí)現(xiàn)了電話的錄音和保存。</p><p><b>  6總結(jié)</b></p><p>  此次畢業(yè)設(shè)計(jì)基本完成了一個(gè)手機(jī)通話錄音系統(tǒng),選擇這個(gè)課題一方面是根據(jù)現(xiàn)在人們這方面的需求,另一方面還有市場(chǎng)的需要,它實(shí)現(xiàn)的功能主要包括:錄音文件的保存、開(kāi)機(jī)自啟動(dòng)的設(shè)置、錄音文件的管理、錄音功能的開(kāi)啟和關(guān)閉、文

109、件格式的選擇。由于時(shí)間原因和自己開(kāi)發(fā)經(jīng)驗(yàn)不足,系統(tǒng)存在一些不可避免的問(wèn)題,下一步,我將努力完善該系統(tǒng)。</p><p><b>  致謝</b></p><p>  行文至此,我的這篇論文已接近尾聲,本文從選題,軟件設(shè)計(jì),軟件實(shí)現(xiàn),形成初稿,以致最終定稿,都得到了老師以及其他同學(xué)、學(xué)長(zhǎng)的幫助。尤其在功能設(shè)計(jì)階段,讓我對(duì)Android系統(tǒng)有了更深層次的體會(huì),對(duì)文檔的各個(gè)

110、部分的編寫讓我充分認(rèn)識(shí)到各個(gè)部分各有其作用,缺一不可。在這里,再次向那些在系統(tǒng)開(kāi)發(fā)過(guò)程中為我提供幫助的老師和同學(xué)表示感謝。</p><p><b>  附圖</b></p><p>  圖1主界面 圖2 錄音列表 圖3 打開(kāi)方式</p><p>  圖4 類型選擇

111、 圖5關(guān)于</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 3G繼續(xù)穩(wěn)步快行[J]. 中國(guó)電信業(yè), 2007( 2): 5051</p><p>  [2] 陳汗青,呂杰鋒編著.數(shù)碼設(shè)計(jì)藝術(shù)[M]. 人民美術(shù)出版社, 2004</p><p>  [3] Code Home.Andr

112、oid An Open Handset Alliance Project [EB /OL]. 2008.01.01</p><p>  [4] 邸爍. Android揭秘和未來(lái)發(fā)展趨勢(shì)[EB /OL]. 2008.03.17</p><p>  [5] 張超, 王阿川, 王智. 基于J2ME 和J2EE 的手機(jī)軟件的研究[J]. 黑龍江科技信息, 2007( 3): 21- 201<

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論