2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、p><p>  學(xué) 號: 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)在移動設(shè)備呈幾何形增加,移動設(shè)備的演化增加了各種移動設(shè)備的應(yīng)用程序開發(fā),這些移動設(shè)備可以成為承載WEB服務(wù)的客戶端,移動的硬件和軟件平臺形式允許更快和更豐富的應(yīng)用程序的運行。本文所介紹的通話錄音系統(tǒng)趨于國際化也被越來越多的人接受 ,自2000年以來,全國手機(jī)基本上普遍都具

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

5、發(fā)技術(shù),在此基礎(chǔ)上分析了手機(jī)通話錄音系統(tǒng)Android客戶端程序的基本架構(gòu)以及各個模塊的解決方案,實現(xiàn)通話錄音的打開、關(guān)閉、播放、刪除、保存、選擇格式等功能。</p><p>  關(guān)鍵字:移動設(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ā)展趨勢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.開發(fā)環(huán)境和開發(fā)技術(shù)2</p><p>  3.1Android平臺介紹2</p><p>  3.2Android基本框架介紹3</p><p>  3.3開發(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開機(jī)自啟動的設(shè)置9</p><p>  4.4錄音文件的管理9</p><p>  4.5功能的開啟和關(guān)閉10</p><p>  4.6錄音文件

15、格式的選擇11</p><p>  5.關(guān)鍵程序設(shè)計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)常會遇到這樣的問題,交流雙方或者對接雙方在通過電話溝通交流的時候,由于無法做到面面,所以所說的話,經(jīng)常會發(fā)生歧義造成雙方發(fā)生誤解,尤其是在企業(yè)管理中

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

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

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

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

22、lt;p>  2.1.3經(jīng)濟(jì)可行性</p><p>  該項目相比而言總體規(guī)模不大,開發(fā)周期比較短,且投入成本較少,并且目前Android手機(jī)越來越普遍,客戶端成本非常低廉,易于管理和維護(hù)。因此在成本上不是問題。</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>  (見附圖)</b></p><p>  3.開發(fā)環(huán)境和開發(fā)技術(shù)</p><p>  3.1 Android平臺介紹</p><p>  無論對于生產(chǎn)Android軟件,還是硬件的企業(yè)來

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

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

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

27、基數(shù)也會非常的大,無疑這也會推動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)運行庫層以及Linux內(nèi)核層。</p><p>  應(yīng)

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

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

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

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

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

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

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

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

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

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

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

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

40、狀態(tài),它可以通過從新啟動進(jìn)入Initial 狀態(tài)。</p><p>  下圖為MediaRecorder從初始化到結(jié)束的整個流程圖:</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>  //檢驗空間是否足夠大</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ù)是用來創(chuàng)建一個空文件來供存儲錄音的音頻。</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>  //開始錄音</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ù)是封裝的開始錄音函數(shù),將MediaRecorder復(fù)雜的init,prepare等初始化過程封裝在了一個函數(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ù)庫</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> ?。?lt;/b></p><p>  此函數(shù)是將暫停錄音,保存錄音文件、插入數(shù)據(jù)庫、發(fā)送廣播來掃描錄制的此文件封裝到了一起。</p><p>  在主線程中只需調(diào)用這三個函數(shù)即可完成錄音文件的創(chuàng)建和保存,大大優(yōu)化了效率,以及

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

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

75、ED 廣播消息,就好像告訴所有的應(yīng)用程序手機(jī)啟動起來了。</p><p>  BroadcastReceiver(廣播接收器)是Android中的四大組件之一。此程序就是利用BroadcastReceiver來接受BOOT_COMPLETED消息,然后就開始監(jiān)聽用戶的電話狀態(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>  //開機(jī)自啟動關(guān)閉,錄音功能開啟 ,關(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>  這樣就實現(xiàn)了開機(jī)自啟動的功能。</p><p>  4.4錄音文件的管理</p><p>  在此程序中實現(xiàn)了一個簡單的文件管理器,利用ListActi

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

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

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

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

86、edPreferences完成,它提供了Android平臺常規(guī)的Long長 整形、Int整形、String字符串型的保存。</p><p>  在Android系統(tǒng)中,在主界面有一個checkbox用戶來進(jìn)行對電話錄音功能的開啟和關(guān)閉。當(dāng)用戶點擊,程序會監(jiā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)志位,來對開啟和關(guān)閉錄音進(jìn)行操作。</p><p>  4.6錄音文件格式的選擇</p><p

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

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

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

96、ndroid平臺中,PhoneStateListener是個很有用的監(jiān)聽器,用來監(jiān)聽電話的狀態(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ài)。在TelephonyManager中定義了三種狀態(tài),分別是振鈴(RINGING),摘機(jī)(OFFHOOK)和空閑(IDLE),我們通過state的值就知道現(xiàn)在的電話狀態(tài)了。</p><p>  獲得了TelephonyManager接口之后,調(diào)用

100、listen()方法即可監(jiān)聽電話狀態(tài)。</p><p>  也就是說當(dāng)用PhoneStateListener來監(jiān)聽用戶的來電和去電狀態(tài),來調(diào)用之前封裝好的startRecord和stopRecord 函數(shù)來進(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無法獲取到值。</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, "接聽");</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, "響鈴:來電號碼" + incomingNumber);</p><p>  mNumber = incomingNumber;

107、</p><p><b>  // 輸出來電號碼</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  };&

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

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

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

111、 圖5關(guān)于</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 3G繼續(xù)穩(wěn)步快行[J]. 中國電信業(yè), 2007( 2): 5051</p><p>  [2] 陳汗青,呂杰鋒編著.數(shù)碼設(shè)計藝術(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揭秘和未來發(fā)展趨勢[EB /OL]. 2008.03.17</p><p>  [5] 張超, 王阿川, 王智. 基于J2ME 和J2EE 的手機(jī)軟件的研究[J]. 黑龍江科技信息, 2007( 3): 21- 201<

溫馨提示

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

評論

0/150

提交評論