




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、池州學(xué)院本科畢業(yè)論文(設(shè)計(jì)) - 29 -前 言 Android是一種自由的且開放源代碼的HYPERLINK /view/880.htm操作系統(tǒng),它基于HYPERLINK /view/1634.htmLinux,其最顯著的優(yōu)勢(shì)就是極佳的塑造性極高的開放性。開放的源碼吸引大量的開發(fā)者和手機(jī)開發(fā)商,開放的平臺(tái)帶來(lái)更大的競(jìng)爭(zhēng),讓更多的消費(fèi)者能夠以低價(jià)位買到心儀的手機(jī)。隨著智能手機(jī)的日益普遍和Android應(yīng)用,游戲的日益豐富,一個(gè)嶄新的智能平臺(tái)也正在走向成熟。本課題的目的就是開發(fā)出一款基于Android平臺(tái)文件管理器,具備普通文件管理器所具備的基本功能,包括復(fù)制,剪切,粘貼,刪除,以及藍(lán)牙發(fā)送和接受
2、文件等。具有快速,穩(wěn)定等特點(diǎn)。1 Android應(yīng)用概述 1.1 研究?jī)?nèi)容 Android平臺(tái)文件管理器的設(shè)計(jì),主要是滿足了人們?nèi)粘I钪袑?duì)手機(jī)文件的常用操作包括復(fù)制,粘貼,刪除以及對(duì)文件共享的一些特殊情況的人性化設(shè)置。 1.2 研究意義Android是基于HYPERLINK /view/1634.htmLinux的開放源代碼的HYPERLINK /view/880.htm操作系統(tǒng)。2012年11月數(shù)據(jù)調(diào)查顯示,Android占有全世界智能HYPERLINK /view/148382.htm手機(jī)操作系統(tǒng)76%的市場(chǎng)份額,而中國(guó)市場(chǎng)占有率達(dá)90%1。隨著Android智能手機(jī)價(jià)格的平民化,那些功
3、能不強(qiáng),畫面單調(diào),鍵盤操作過(guò)時(shí)的塞班系統(tǒng)手機(jī)已經(jīng)逐漸被淘汰了。在Android平臺(tái)開發(fā)應(yīng)用或游戲,前景廣闊,市場(chǎng)需求量大。以前落后的操作手機(jī)上所有能玩的,在Android平臺(tái)都能做到,而且做得更好,界面效果更炫,用戶體驗(yàn)更佳2。隨著手機(jī)成為人們?nèi)粘I詈凸ぷ鞑豢苫蛉钡闹匾ㄓ嵐ぞ?,其功能越?lái)越強(qiáng)大。但隨著智能手機(jī)的廣泛應(yīng)用以及技術(shù)的日漸成熟,漸漸也引起人們對(duì)于手機(jī)文件安全以及文件管理的越來(lái)越多的關(guān)注和擔(dān)心。 Android作為開源智能手機(jī)操作系統(tǒng),在手機(jī)業(yè)界造成了巨大影響,其安全性也隨著普及度日益突出。特別是2011以來(lái),隨著Android應(yīng)用的飛速增長(zhǎng),各種針對(duì)Android 系統(tǒng)的惡意軟件
4、以及攻擊暴增。因此,Android平臺(tái)的文件管理的問(wèn)題,無(wú)疑是一個(gè)非常有價(jià)值的研究課題。 1.3 研究現(xiàn)狀和發(fā)展趨勢(shì)最早期的Android由Google公司提出,后來(lái)由開放手機(jī)聯(lián)盟深入開發(fā)。它是一款基于Linux核心(C語(yǔ)言)的軟件平臺(tái)和操作系統(tǒng),由核心操作系統(tǒng),中間件,用戶界面和應(yīng)用軟件層組成。它具有開放式的體系結(jié)構(gòu),擁有非常良好的開發(fā)和調(diào)試環(huán)境,支持各種可擴(kuò)展的用戶體驗(yàn),存在非常豐富的圖形系統(tǒng),因而有支持多媒體的功能和強(qiáng)大的瀏覽器。號(hào)稱是由首個(gè)移動(dòng)終端打造的真正開放和完整的移動(dòng)軟件。Android底層以Linux核心工作為基礎(chǔ),只提供最基本功能,如驅(qū)動(dòng)程序。其它的應(yīng)用以java語(yǔ)言作為編程
5、規(guī)范編寫。截至5月31日,Android智能手機(jī)市場(chǎng)份額為38.1%。iphone市場(chǎng)份額為27.3%,黑莓市場(chǎng)份額從24.7%下滑至19.7%,Windows Phone市場(chǎng)份額也有了小幅下降,從5.8%下滑至5.7%。由于Android平臺(tái)的開源政策,他越來(lái)越受到人們的喜愛。Google+Linux的模式正逐漸成熟??梢灶A(yù)見,智能手機(jī)陣營(yíng)中Android的市場(chǎng)占有率會(huì)越來(lái)越大,研究基于Android的文件的管理也會(huì)得到廣泛的應(yīng)用。目前國(guó)內(nèi)android開發(fā)還是主要以應(yīng)用開發(fā)為主:為企業(yè)開發(fā)應(yīng)用、開發(fā)通用應(yīng)用以及游戲開發(fā)。把開發(fā)出來(lái)的軟件放到Android market或者其他App Mar
6、ket銷售;還有就是一些創(chuàng)業(yè)型公司為國(guó)外公司進(jìn)行外包開發(fā)。其中應(yīng)用開發(fā)遠(yuǎn)大于游戲的開發(fā)。2 系統(tǒng)分析 2.1 研究目標(biāo)本軟件是基于Eclipse的開發(fā)環(huán)境,通過(guò)安裝ADT插件與AndroidSDK,由于目前市場(chǎng)的Android系統(tǒng)主要是2.2以及2.2以上的系統(tǒng),因此本應(yīng)用的開發(fā)環(huán)境設(shè)定為2.2,開發(fā)出了針對(duì)Android文件件管理器。需要達(dá)到的目標(biāo)主要有:(1) 了解Android應(yīng)用程序的設(shè)計(jì)和開發(fā)過(guò)程。(2) 應(yīng)用多種規(guī)則實(shí)現(xiàn)對(duì)Android手機(jī)中文件的管理。 (3) 穩(wěn)定的IO流對(duì)文件進(jìn)行操作7。 (4) 藍(lán)牙文件傳輸。 2.2 需求分析本程序功能上主要包括兩個(gè)模塊: (1)對(duì)文件的普
7、通操作主要包括復(fù)制,粘貼,剪切,刪除,重命名的功能; (2)通過(guò)系統(tǒng)自帶的藍(lán)牙功能在有藍(lán)牙功能的手機(jī)之間發(fā)送文件。 2.3 性能分析 本程序性能的體現(xiàn)主要表現(xiàn)在對(duì)一些普通文件的操作,系統(tǒng)文件可見但由于考慮到系統(tǒng)的安全性問(wèn)題以及手機(jī)系統(tǒng)的穩(wěn)定,將設(shè)定為不可操作。在軟件的整體性能上要求軟件必須有一定的,健壯性和穩(wěn)定性,對(duì)不同版本的Android系統(tǒng)有一定的兼容性。 3 Android應(yīng)用概述 3.1 創(chuàng)建Android應(yīng)用 打開eclipse,一次點(diǎn)擊File-New-Android Application Project,將看到如下圖所示的界面,下面依次講解各個(gè)選項(xiàng)的意義和用途。 (1) Pro
8、ject Name: 應(yīng)用的工程名稱,在eclipse中開發(fā)時(shí)的總項(xiàng)目的跟文件夾的名稱,是應(yīng)用程序的標(biāo)識(shí); (2) Package Name: 在src目錄下 的你的包名稱,一般命名為與自己信息相關(guān)的名稱,比如com.xyz.demo; (3) Mininum Required SDK: 你的程序要運(yùn)行的最低android的系統(tǒng)版本,比如你設(shè)為2.3版本的話,那你的程序在2.3以下的手機(jī)系統(tǒng)上是無(wú)法運(yùn)行的; (4) Target SDK: 如果設(shè)置了此屬性,那么在程序執(zhí)行時(shí),如果目標(biāo)設(shè)備的API版本正好等于此數(shù)值,他會(huì)告訴Android平臺(tái):此程序在此版本已經(jīng)經(jīng)過(guò)充分測(cè),沒(méi)有問(wèn)題。不必為此程序
9、開啟兼容性檢查判斷的工作了。也就是說(shuō),如果targetSdkVersion與目標(biāo)設(shè)備的API版本相同時(shí),運(yùn)行效率可能會(huì)高一些。但是,這個(gè)設(shè)置僅僅是一個(gè)聲明、一個(gè)通知,不會(huì)有太實(shí)質(zhì)的作用,比如說(shuō),使用了targetSdkVersion這個(gè)SDK版本中的一個(gè)特性,但是這個(gè)特性在低版本中是不支持的,那么在低版本的API設(shè)備上運(yùn)行程序時(shí),可能會(huì)報(bào)錯(cuò):java.lang.VerifyError。也就是說(shuō),此屬性不會(huì)幫你解決兼容性的測(cè)試問(wèn)題。你至少需要在minSdkVersion這個(gè)版本上將程序完整的跑一遍來(lái)確定兼容性是沒(méi)有問(wèn)題的。為避免以上問(wèn)題以及提高效率,在本項(xiàng)目中,我們統(tǒng)一使用2.2版本。 (5)
10、Compile With: 就是你的程序要用android的那個(gè)版本的編譯器進(jìn)行編譯,如果設(shè)置的高了,有些過(guò)時(shí)的方法會(huì)提示不建議使用的標(biāo)示,設(shè)置的低了,對(duì)于一些高版本的新方法的使用在低版本的android手機(jī)上時(shí)無(wú)法使用的。2.2版本是目前最流行的開發(fā)SDK版本,因此本引用在2.2以下的版本中將無(wú)法使用或出現(xiàn)兼容性問(wèn)題。 (6) Theme:顧名思義,主題的意思,就是設(shè)置你的程序的主題是黑色還是白色主題,android中常用這兩個(gè)默認(rèn)的吧。該值將最終出現(xiàn)在AndroidManifest.xml中,并成為應(yīng)用的主題,在創(chuàng)建過(guò)程中,此處只有四個(gè)選項(xiàng),但到AndroidManifest.xml里修改
11、時(shí)應(yīng)用可以有十多個(gè)值,甚至支持自定義的主題。圖3-1 新建項(xiàng)目3.2 項(xiàng)目目錄介紹可以看到在名為Application(項(xiàng)目名)的文件夾下面有src、gen、Android 4.4 libs等文件夾,每一個(gè)文件夾都對(duì)應(yīng)有不同的作用3。(1)src下面放置的是開發(fā)人員自己編寫的代碼,具體內(nèi)容如下com.example是當(dāng)前項(xiàng)目的包名(package name),里面包含了一個(gè)MainActivity.java文件,這個(gè)文件是當(dāng)前整個(gè)Android項(xiàng)目運(yùn)行時(shí)的入口,有如C語(yǔ)言的Main方法。(2) gen文件夾,里面的文件是程序自動(dòng)生成的代碼,不用手動(dòng)修改。里面有兩個(gè)文件:BuildConfig.
12、java是調(diào)試(Debug)時(shí)用的,一般不管。R.java 這個(gè)文件時(shí)eclipse軟件是自動(dòng)產(chǎn)生的。會(huì)由 ADT 插件自動(dòng)根據(jù)你放入 res 目錄的 XML 描述文件、圖像等資源,同步更新修改 R.java這個(gè)文件中,R.java是定義該項(xiàng)目所擁有的所有資源的索引文件。以 R.java 為名的這個(gè)檔案,你完全不需要,也應(yīng)避免和禁止手工修改 R.java 這個(gè)檔案。自動(dòng)產(chǎn)生的R 文件就像是個(gè)整個(gè)應(yīng)用的字典一樣,包含了使用者界面、圖像、字符串等各式的資源與相應(yīng)的編號(hào) (十六進(jìn)制的id) 。 Android 應(yīng)用程序中很多時(shí)候會(huì)需要透過(guò) R 類別調(diào)用資源。 系統(tǒng)在編譯時(shí)編譯器也會(huì)查看這個(gè)資源列表中
13、的信息,沒(méi)有使用到的資源就不會(huì)系統(tǒng)編譯,避免應(yīng)用程序內(nèi)存空間的浪費(fèi)。另外,當(dāng)應(yīng)用的資源丟失,或SDK的版本錯(cuò)誤時(shí),R.java文件也會(huì)丟失,給開發(fā)帶來(lái)很多麻煩。以上的src以及gen可以歸類為源碼區(qū),除了放置程序自動(dòng)生成的源碼,自己寫的代碼也幾乎是放在src中。(3) 還有Android 4.4及Android Private Library,兩個(gè)都是類庫(kù),前者是Android類庫(kù),后者是新的SDK版本才有的,包含了libs下引入的第三方包。(4) Asset里面放置的是資源文件(5) Libs放置的是第三方j(luò)ar包,但最新版本的ADK下會(huì)將這些第三方包轉(zhuǎn)移到Android Private L
14、ibrary里面。(6) res也是資源文件的放置位置,和Asset最明顯的不同點(diǎn)是res里的資源文件會(huì)通過(guò)R.java來(lái)生成ID,而Asset里的資源文件則不會(huì),具體區(qū)別自己可谷歌一下。在res下面還有幾個(gè)比較重要和常見的文件夾:drawable-hdpi/drawable-ldpi/drawable-mdpi:分別放置高、低、中等分辨率的圖片,程序會(huì)自動(dòng)根據(jù)運(yùn)行設(shè)備的分辨率更換匹配大小的圖片。layout:放置布局文件(XML描述文件),布局文件是調(diào)整制定Activity的窗口布局文件。values:放置styles.xml以及strings.xml文件。(7) AndroidManife
15、st.xml 是 Android 應(yīng)用程序的功能清單9,應(yīng)用程序在這里列出該工程所提供的完整的功能。當(dāng)應(yīng)用程序開啟時(shí),會(huì)提供諸如內(nèi)容提供者 (ContentProvider) 、處理的資料類型、 實(shí)際運(yùn)行的類別、跨應(yīng)用程序的資訊等等訊息。 你可以在此指定你的應(yīng)用程序會(huì)使用到的服務(wù) ( 諸如電話功能、網(wǎng)路功能、 GPS 功能等 ) 。當(dāng)你新增一個(gè)頁(yè)面行為類別 (Activity) 時(shí) ,你也需要先在此注冊(cè)這個(gè)新增的 Activity 類別后,才能順利調(diào)用1圖3-2 Android項(xiàng)目文件目錄4 文件管理器總體設(shè)計(jì) 4.1 文件管理器功能需求分析 項(xiàng)目的設(shè)計(jì)流程通常是基于項(xiàng)目的功能來(lái)安排的。以下是
16、文件管理器的功能需求分析: (1)掃描SD卡的目錄,獲得文件的完整路徑和名稱,并根據(jù)文件的后綴名判斷文件類型,然后根據(jù)文件類型,分配圖標(biāo),使用ListView顯示文件列表。 (2)為L(zhǎng)istView注冊(cè)單擊事件,單擊事件的響應(yīng)過(guò)程:根據(jù)文件ListView的位置獲得對(duì)應(yīng)的文件,根據(jù)文件的后綴名分配對(duì)應(yīng)的Intent(意圖),并講Intent發(fā)出,當(dāng)手機(jī)中有注冊(cè)了對(duì)應(yīng)的Intent的應(yīng)用時(shí),會(huì)彈出窗口,讓用戶自己選擇打開文件的應(yīng)用程序。(以上除了發(fā)出Intent之外,都由系統(tǒng)自行完成。) (3)為L(zhǎng)istView注冊(cè)長(zhǎng)按事件,長(zhǎng)按后彈出上下文菜單(ContextMenu),并完成剪切,復(fù)制,刪除
17、,重命名,屬性,粘貼,藍(lán)牙發(fā)送的功能。 (4)Android任何功能實(shí)現(xiàn)的基礎(chǔ)都是良好的界面,界面的好壞直接影響到用戶的好感度8,所以對(duì)于Android應(yīng)用的開發(fā),尤其要注意界面的開發(fā)。如今大多數(shù)應(yīng)用的版本升級(jí),做的基本上都是設(shè)計(jì)更好的界面贏得更多用戶的青睞6。 4.2 文件管理器的功能實(shí)現(xiàn) 4.2.1 獲得SD卡內(nèi)的文件 Java是面向?qū)ο蟮木幊陶Z(yǔ)言4,因此程序中將SD卡內(nèi)的文件(“文件”不僅是指硬盤上的數(shù)據(jù),它還包括任何設(shè)備資源。在Unix_like系統(tǒng)中,所有的硬件設(shè)備都被看做是文件,“文件”是內(nèi)核范疇的概念,磁盤,U盤,內(nèi)存,網(wǎng)絡(luò),甚至CPU都被內(nèi)核抽象為“文件”。5)抽象為File類
18、的對(duì)象。FilecurFileList= getFiles(Environment.getExternalStorageDirectory();MyListViewAdapter adapter = new MyListViewAdapter(this, curFileList); listview.setAdapter(adapter);如上述代碼所述,使用File類數(shù)組存儲(chǔ)內(nèi)存卡內(nèi)的文件,并將數(shù)組和當(dāng)前Activity的Context和文件數(shù)組作為參數(shù)傳遞到Lisiview的Adapter(適配器)中。Overridepublic View getView(int position, Vi
19、ew convertView, ViewGroup arg2) Bitmap logo = null;View itemView = View.inflate(context, R.layout.listviewitem, null);ImageView imageView =(ImageView) itemView.findViewById(R.id.imageView); 上述代碼是初始化ListView的列表Item上的圖標(biāo),使得后面在判斷文件的類后可以在對(duì)應(yīng)的圖標(biāo)位置顯示相應(yīng)的圖標(biāo)。if(filesposition.isDirectory()logo = BitmapFactory.d
20、ecodeResource(context.getResources(), R.drawable.folder); 上述代碼是判斷文件的類型,當(dāng)文件的類型為文件夾時(shí),顯示相應(yīng)的文件夾圖標(biāo)。else if(filesposition.isFile()String name=filesposition.getName().toLowerCase();if(name.endsWith(.txt)logo= BitmapFactory.decodeResource(context.getResources(), R.drawable.text); 當(dāng)文件的類型為普通文件時(shí),根據(jù)文件的后綴名判斷文件的M
21、IME類型顯示相應(yīng)的圖標(biāo),當(dāng)文件名為“.txt”結(jié)束時(shí),顯示對(duì)應(yīng)的圖標(biāo)。else if(name.endsWith(.mp3)logo= BitmapFactory.decodeResource(context.getResources(), R.drawable.audio);else if(name.endsWith(.jpg)|name.endsWith(.png)|name.endsWith(.jpeg)|name.endsWith(.bmp)logo= BitmapFactory.decodeResource(context.getResources(), R.drawable.pi
22、ctures);else if(name.endsWith(.mav)logo= BitmapFactory.decodeResource(context.getResources(), R.drawable.wav);else if(name.endsWith(.pdf)logo= BitmapFactory.decodeResource(context.getResources(), R.drawable.pdf);elselogo= BitmapFactory.decodeResource(context.getResources(), R.drawable.none); 當(dāng)文件的后綴名
23、無(wú)法取得對(duì)應(yīng)的圖標(biāo),或者文件沒(méi)有后綴名時(shí),文件的圖標(biāo)為帶問(wèn)號(hào)的圖標(biāo)。imageView.setImageBitmap(logo);TextView tv = (TextView) itemView.findViewById(R.id.filename);if(position = 0)tv.setText(MainActivity.path); 當(dāng)文件列表的位置為0時(shí),顯示是對(duì)應(yīng)的文件夾路徑。elsetv.setText(filesposition.getName(); 當(dāng)文件列表的位置不為0時(shí),顯示是對(duì)應(yīng)的列表項(xiàng)的文件或文件夾名稱。return itemView;以上代碼為Adapter的核
24、心代碼,即根據(jù)File數(shù)組的內(nèi)容顯示出對(duì)應(yīng)的界面,根據(jù)File數(shù)組的類型,判斷文件時(shí)文件夾還是文件(Linnux中文件是一個(gè)抽象的概念,包括內(nèi)存卡在內(nèi),文件夾也屬于文件的范疇,java的File類可以判斷文件是文件夾還是文件),并根據(jù)類型加載不同的圖標(biāo)。 如果是文件的話,會(huì)繼續(xù)根據(jù)文件的后綴嗎名判斷文件的類型,在如上的代碼中,MP3文件,TXT文件,PDF文件以及PNG文件等幾種常見的文件都加載了各自的圖標(biāo),當(dāng)文件類型不可辨識(shí)或沒(méi)有后綴名時(shí)加載統(tǒng)一的未知文件類型的圖標(biāo)。(在實(shí)際開發(fā)過(guò)程中,為防止用戶的誤操作而對(duì)文件進(jìn)行保護(hù),將文件屬性設(shè)置成不可讀,或因?yàn)榘踩珕?wèn)題不想讓用戶解析,或不想讓用戶打開
25、某文件,經(jīng)常采用故意修改文件后綴名或直接去掉后綴的方法)。 正確編譯和運(yùn)行以上代碼,會(huì)顯示如下圖的界面,此圖顯示了手機(jī)SD卡內(nèi)的所有文件。圖4-1 獲取文件列表 4.2.2 為L(zhǎng)istView注冊(cè)單擊事件并處理listview.setOnItemClickListener(new OnItemClickListener() Overridepublic void onItemClick(AdapterView arg0, View arg1,int position, long arg3) if(curFileListposition.isDirectory()path=curFileList
26、position.getAbsolutePath(); 點(diǎn)擊列表的選項(xiàng)時(shí),獲取對(duì)應(yīng)文件的絕對(duì)路徑。if (!curFileListposition.canRead() Toast.makeText(MainActivity.this, 拒絕訪問(wèn), 2000).show();return; 當(dāng)文件受到系統(tǒng)的保護(hù)時(shí),彈出友好提示,提示用戶改文件或文件夾為系統(tǒng)不可讀。if (curFileListposition.isFile() openFile(curFileListposition.getAbsoluteFile(); 當(dāng)對(duì)應(yīng)的文件為系統(tǒng)可讀文件且為普通文件時(shí),調(diào)用程序中對(duì)應(yīng)的的打開文件的程序
27、。elsecurFileList = getFiles(curFileListposition);/Log.e(curFileListposition, curFileListposition.getAbsolutePath(); 當(dāng)對(duì)應(yīng)的不是普通文件而是文件夾時(shí),會(huì)調(diào)用程序中相應(yīng)的打開文件夾的方法,獲取文件夾下的所有文件列表,并如同上述打開SD卡列表的方法打開文件夾的文件列表。MyListViewAdapter adapter = new MyListViewAdapter(getApplicationContext(), curFileList);listview.setAdapter(a
28、dapter);); 如上代碼是為L(zhǎng)istView注冊(cè)并處理單擊事件單擊事件,當(dāng)文件夾可讀時(shí),判斷類型,如果單擊的是文件夾是,會(huì)重復(fù)打開內(nèi)存卡的步驟,如下圖所示是打開BlueTooth文件夾的界面。圖 4-2 打開文件夾目錄 當(dāng)單擊文件時(shí),調(diào)用openFile()方法,以下為openFile()方法代碼 ,當(dāng)該方法被調(diào)用 ,程序會(huì)為選中的文件添加一個(gè) intent屬性type,將對(duì)應(yīng)的文件抽象成file傳入getMIMEType(aFile)方法中。private void openFile(File aFile) Intent intent=new Intent();intent.addFl
29、ags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);String type=getMIMEType(aFile); 打開普通文件的核心方法,根據(jù)文件的后綴名獲取對(duì)應(yīng)文件的MIME類型,發(fā)出intent中帶有相應(yīng)的type字段。intent.setDataAndType(Uri.fromFile(aFile), type); startActivity(intent); 以下為getMIMEType(File aFile) 方法,在該方法中,程序獲得了完整的文件名,并根據(jù)文
30、件名的后綴返回對(duì)應(yīng)的類型,并將該類型添加到openFile()方法的intent對(duì)象中,當(dāng)程序發(fā)出intent時(shí),手機(jī)中注冊(cè)了該intent的應(yīng)用會(huì)被加入到選擇打開程序的列表中10,正確編譯和運(yùn)行以下代碼,將顯示如下圖所示的界面。private String getMIMEType(File aFile) String type=;String fName=aFile.getName();String end=fName.substring(fName.lastIndexOf(.)+1, fName.length().toLowerCase(); 根據(jù)文件的名稱獲取文件的后綴,以備后面的判斷時(shí)
31、使用。if(end.equals(m4a)|end.equals(mp3)|end.equals(mid)|end.equals(wav)|end.equals(ogg)type=audio; 當(dāng)后綴名為m4a,mp3,wav時(shí),返回的type的指端為“audio”;else if(end.equals(3gp)|end.equals(mp4)type=video; 當(dāng)后綴名為3pg或mp4時(shí),返回的type的指端為“video”;else if(end.equals(jpg)|end.equals(gif)|end.equals(png)|end.equals(jpeg)|end.equal
32、s(bmp)type=image; 當(dāng)后綴名為jpg,gif,png等對(duì)應(yīng)的圖片后綴時(shí),返回的type的指端為“image”;else if(end.equals(apk)type=application/vnd.android.package-archive; 特別的,當(dāng)后綴名為apk時(shí),返回的type的指端為“application/vnd.android.package-archive”,返回時(shí)會(huì)調(diào)用系統(tǒng)方法安裝應(yīng)用;else if(end.equals(chm)|end.equals(txt)|end.equals(java)type=text; 當(dāng)后綴名為chm,txt或java時(shí),
33、返回的type的指端為“text”;else if(end.equals(pdf)type=pdf;elsetype=*;if(end.equals(apk)elsetype=type+/*;return type;圖 4-3 選擇打開文件程序4.2.3 為L(zhǎng)istView注冊(cè)長(zhǎng)按事件并處理下面的方法為重寫的上下文菜單的方法,當(dāng)用戶長(zhǎng)按ListView的項(xiàng)目時(shí),用戶的長(zhǎng)按事件會(huì)交由如下的方法處理。public void onCreateContextMenu(ContextMenu menu, View source,ContextMenu.ContextMenuInfo menuInfo)
34、menu.add(0, ID_MENU_CUT, 120, 剪切);menu.add(0, ID_MENU_COPY, 130, 復(fù)制);menu.add(0, ID_MENU_DELETE, 140, 刪除);menu.add(0, ID_MENU_RENAME, 150, 重命名);menu.add(0, ID_MENU_PROPERTY, 160, 屬性);menu.add(0, ID_MENU_PASTE, 170, 粘貼); 在該方法中,注冊(cè)過(guò)上下文菜單的View對(duì)象,彈出上下文菜單,上述的代碼為給上下文菜單添加菜單子項(xiàng),此處添加了復(fù)制,粘貼,刪除,重命名等菜單子項(xiàng),后文會(huì)詳細(xì)介紹各
35、子菜單的具體用途。String fromFile = null;String toFile = null;String fFile = null;File cutFile = null;public boolean onContextItemSelected(MenuItem item) AdapterView.AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();final int index = (int) menuInfo.id; 上面添加子菜單的流程之后,在此處為子項(xiàng)分配ID和視圖,以
36、便在點(diǎn)擊時(shí)處理相應(yīng)的點(diǎn)擊事件。switch (item.getItemId() case ID_MENU_CUT:fFile = curFileListindex.getAbsoluteFile().toString();cutFile = curFileListindex.getAbsoluteFile();break; 此處處理的為菜單的剪切事件,并記錄下對(duì)應(yīng)的文件的絕對(duì)路徑并將對(duì)應(yīng)的文件抽象成剪切的對(duì)象。case ID_MENU_COPY:fromFile = curFileListindex.getAbsolutePath().toString(); if(curFileListind
37、ex.getAbsoluteFile().isFile() isFile=true; else if(curFileListindex.getAbsoluteFile().isDirectory() copyFile(fromFile,toFile);break; 此處的代碼用于處理復(fù)制事件,記錄下對(duì)應(yīng)文件的絕對(duì)路徑,并將對(duì)應(yīng)的文件抽象成File對(duì)象,并立即判斷對(duì)應(yīng)的文件時(shí)普通文件還是文件夾,并分別調(diào)用復(fù)制文件或文件夾的方法。復(fù)制文件和文件夾的處理方式有很大的區(qū)別,后文中會(huì)具體詳述。case ID_MENU_PASTE:toFile = curFileListindex.getAbsolute
38、Path().toString();if (fromFile != null) Log.e(paste, fromFile); if(isFile=true) copyFile(fromFile,toFile); isFile=false; 此處處理上下文菜單中對(duì)應(yīng)的粘貼事件,并獲取對(duì)應(yīng)的文件絕對(duì)路徑,獲取對(duì)應(yīng)的文件抽象成File對(duì)象。 elsetry copyFloder(fromFile, toFile); 當(dāng)源文件標(biāo)記為復(fù)制文件時(shí),分為復(fù)制文件和復(fù)制文件夾兩種情況,上文中標(biāo)記的文件實(shí)例在此處使用。 catch (IOException e) e.printStackTrace();fin
39、ally if(fFile!=null) if(cutFile.isFile() copyFile(fFile, toFile); delete(cutFile); 此處代碼先判讀標(biāo)記的剪切文件是否為空,當(dāng)標(biāo)記不為空,調(diào)用程序中的代碼處理剪切事件,其實(shí)是調(diào)用了上文的復(fù)制事件,然后調(diào)用系統(tǒng)的刪除方法刪除對(duì)應(yīng)的文件。 if(cutFile.isDirectory() try copyFloder(fFile, toFile); catch (IOException e) e.printStackTrace();finallydelete(cutFile); 此處代碼被標(biāo)記剪切的文件為文件夾的處理事
40、件,調(diào)用程序中的復(fù)制文件夾的方法,再調(diào)用刪除文件的方法,刪除文件方法內(nèi)部會(huì)判斷選擇的文件是文件或文件夾,并分別處理。MyListViewAdapter adapter1 = new MyListViewAdapter(getApplicationContext(),getFiles(curFileListindex.getParentFile();adapter1.notifyDataSetChanged();listview.setAdapter(adapter1);break; 重新獲取當(dāng)前顯示目錄下的全部文件,并調(diào)用上文中顯示文件列表的方法,刷新列表,重新加載。case ID_MENU_
41、PROPERTY:AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setIcon(R.drawable.ic_launcher);builder.setTitle(文件屬性:);String path = curFileListindex.getAbsolutePath().toString();String name = curFileListindex.getName().toString(); 此處代碼處理的是查看文件屬性的事件,程序中會(huì)彈出對(duì)話框,并獲取文件的絕對(duì)路徑,文件名,并設(shè)置對(duì)話框的標(biāo)題。l
42、ong size = 0;if(curFileListindex.getAbsoluteFile().isFile()size = curFileListindex.length(); 此處代碼用于獲取File對(duì)象的長(zhǎng)度,及字節(jié)長(zhǎng)度,變量的類型為long類型。 if(curFileListindex.getAbsoluteFile().isDirectory() try size=getsize(curFileListindex.getAbsoluteFile(); 此處代碼用于獲取File對(duì)象的長(zhǎng)度,變量的類型為long類型,并將File對(duì)象判斷普通文件或文件夾,分情況計(jì)算長(zhǎng)度。 catch
43、 (IOException e) e.printStackTrace(); builder.setMessage(文件路徑: + path + n文件名: + name + n文件大小+ size); 顯示對(duì)話框的主要信息,包含了對(duì)應(yīng)的文件對(duì)象的文件絕對(duì)路徑,文件名,以及處理過(guò)長(zhǎng)度的文件大小。builder.setPositiveButton(確定, new OnClickListener() Overridepublic void onClick(DialogInterface arg0, int arg1) );builder.create();builder.show();break;
44、設(shè)置對(duì)話框的確定按鈕,初始化按鈕并顯示出來(lái),點(diǎn)擊到該確定按鈕只會(huì)將對(duì)話框去除,這是一種用戶友好的界面的設(shè)計(jì)。case ID_MENU_DELETE:Builder builder2 = new Builder(MainActivity.this);builder2.setTitle(警告!);builder2.setIcon(R.drawable.ic_launcher);builder2.setMessage(確定要?jiǎng)h除 + curFileListindex.getName(); 此處的代碼處理用戶的刪除的事件,彈出對(duì)話框,警告用戶,標(biāo)題為警告,并設(shè)置圖標(biāo),獲取對(duì)應(yīng)文件的文件名,這也是一種用
45、戶友好體驗(yàn)的設(shè)計(jì)。builder2.setPositiveButton(確定, new OnClickListener() Overridepublic void onClick(DialogInterface arg0, int arg1) delete(curFileListindex.getAbsoluteFile(); 重寫對(duì)話框中的的按鈕點(diǎn)擊方法,并處理刪除對(duì)應(yīng)文件的方法,程序中的刪除方法,改方法的內(nèi)部會(huì)判斷對(duì)應(yīng)的文件對(duì)象是普通文件還是文件夾,并調(diào)用不同的流程刪除文件。MyListViewAdapter adapter = new MyListViewAdapter(getAppli
46、cationContext(),getFiles(curFileListindex.getParentFile();adapter.notifyDataSetChanged();listview.setAdapter(adapter); 刪除文件或文件夾后,重新獲取對(duì)應(yīng)目錄下的所有文件,并重新刷新列表,重新加載界面中的ListView12。);builder2.setNegativeButton(取消, new OnClickListener() Overridepublic void onClick(DialogInterface arg0, int arg1) );builder2.cre
47、ate();builder2.show();break; 設(shè)置對(duì)話框的取消按鈕,點(diǎn)擊取消按鈕,對(duì)話框會(huì)被取消,但取消和確定事件的調(diào)用都是回調(diào)的方法,此處會(huì)初始化界面,并顯示到界面。case ID_MENU_RENAME:final EditText input = new EditText(getApplicationContext();/ AlertDialog dialog;Builder builder1 = new Builder(MainActivity.this);builder1.setTitle(重命名);builder1.setIcon(R.drawable.ic_launc
48、her);builder1.setView(input); 此處的代碼處理用戶的重命名事件,彈出對(duì)話框讓用戶輸入新的用戶名,并在用戶點(diǎn)擊類似確定的按鈕,完成完整的重命名事件。builder1.setPositiveButton(修改, new OnClickListener() Overridepublic void onClick(DialogInterface arg0, int arg1) String rename = input.getText().toString();if (curFileListindex.renameTo(new File(curFileListindex.g
49、etParent() + /, rename) Log.e(rename, success); 獲取對(duì)話框的按鈕確定按鈕,將對(duì)應(yīng)的文件對(duì)象獲取,并調(diào)用File類的對(duì)應(yīng)方法重名該文件。/ Log.e(rename, rename+);MyListViewAdapter adapter = new MyListViewAdapter(getApplicationContext(),getFiles(curFileListindex.getParentFile();adapter.notifyDataSetChanged();listview.setAdapter(adapter);); 在重命名后,系統(tǒng)下的文件列表的名稱,并重新獲取當(dāng)前目錄下的全部文件,給構(gòu)造器新的文件列表,刷新列表。builder1.setNegativeButton(取消, new OnClickListener() Overridepublic void onClick(DialogInterface arg0, int arg1) );builder1.create();builder1.show();break; 同樣的,
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 氣管腫瘤術(shù)后護(hù)理規(guī)范與要點(diǎn)
- 原地單手肩上投籃
- 勞動(dòng)教育實(shí)施路徑與實(shí)踐創(chuàng)新
- 中華護(hù)理學(xué)會(huì)介紹
- 呼吸內(nèi)科創(chuàng)建簡(jiǎn)介
- 采購(gòu)招標(biāo)法律法規(guī)
- 購(gòu)物中心教育培訓(xùn)商業(yè)化探索
- 手術(shù)室胃切除護(hù)理查房
- 子癇前期重度術(shù)后護(hù)理
- 2025年零售門店數(shù)字化技術(shù)應(yīng)用在顧客互動(dòng)營(yíng)銷中的策略報(bào)告
- (完整版)杭州電子科技大學(xué)數(shù)字電路期末考試試卷及答案
- 員工宿舍核查表
- 腰椎椎管狹窄癥治療的新方法課件
- 完工付款最終付款申請(qǐng)表
- 有限空間作業(yè)及應(yīng)急物資清單
- 國(guó)際經(jīng)濟(jì)學(xué)期末考試試題庫(kù)含答案
- 基于PLC的音樂(lè)噴泉控制系統(tǒng)的設(shè)計(jì)-畢業(yè)設(shè)計(jì)
- 體育場(chǎng)地與設(shè)施
- 廣西大學(xué)數(shù)學(xué)建模競(jìng)賽選拔賽題目
- 受戒申請(qǐng)表(共3頁(yè))
- 五年級(jí)部編版語(yǔ)文下學(xué)期修改病句專項(xiàng)強(qiáng)化練習(xí)題
評(píng)論
0/150
提交評(píng)論