版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
江蘇經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)(論文)題目:系(院)專業(yè)班級(jí)學(xué)號(hào)學(xué)生姓名指導(dǎo)教師職稱指導(dǎo)教師職稱2023年05月10日基于Android的記事本設(shè)計(jì)摘要就目前而言Android在很多領(lǐng)域都有廣泛的使用,作為一款面向?qū)ο缶幊痰恼Z(yǔ)言,而且網(wǎng)絡(luò)、多線程等重要的根底知識(shí)安卓都有涉及到,因此安卓言也是學(xué)習(xí)面向?qū)ο缶幊毯途W(wǎng)絡(luò)編程的首選語(yǔ)言。在平時(shí)只是學(xué)習(xí)了安卓的理論知識(shí),并沒有自己獨(dú)立的去完成一個(gè)設(shè)計(jì),課本中指定課時(shí)的知識(shí)學(xué)習(xí)結(jié)束之后,畢業(yè)設(shè)計(jì)是每個(gè)學(xué)生都必須做的。能夠讓學(xué)生深入理解并實(shí)踐在本課程中所學(xué)的有關(guān)安卓程序設(shè)計(jì)方面的語(yǔ)言根底、異常處理、事件處理、小應(yīng)用程序以及圖形用戶界面設(shè)計(jì)等是本次畢業(yè)設(shè)計(jì)的目的。在這次的畢業(yè)設(shè)計(jì)中我的設(shè)計(jì)題目是基于安卓的記事本app設(shè)計(jì)。本課程設(shè)計(jì)是為了配合安卓專門設(shè)計(jì)的,幫助學(xué)生深入學(xué)習(xí)掌握安卓的開發(fā)環(huán)境,通過(guò)此次的畢業(yè)設(shè)計(jì)課題讓學(xué)生更好的掌握安卓平臺(tái)的編程。本次設(shè)計(jì)的基于安卓的記事本app讓使用者對(duì)個(gè)人日記進(jìn)行記錄并且管理,可以顯示日期,對(duì)用戶所做的事情進(jìn)行記錄,相當(dāng)于備忘錄,當(dāng)根本本里面的數(shù)據(jù)信息過(guò)多的時(shí)候可以進(jìn)行刪除。以上就是本次畢業(yè)設(shè)的基于安卓的記事本app所具備的主要功能。關(guān)鍵字:android、app、記事本NotepadAppDesignBasedonandroidabstractAtpresentJavalanguageinmanyfieldsarewidelyusedasanobject-orientedprogramminglanguage,andbasicknowledgeofJavalanguagenetwork,multithreadandotherimportantisinvolved,solearningJavalanguageisthepreferredlanguageofobject-orientedprogrammingandnetworkprogramminglanguage.Inpeacetime,onlytolearnthetheoreticalknowledgeofJava,anddonothavetheirownindependenttocompleteadesign,theknowledgeofthecoursespecifiedinthebookaftertheendofthestudy,thegraduatedesignisnecessaryforeachstudenttodo.TheJAVAprogramminglanguagefoundation,canletthestudentsunderstandandpracticewhattheyhavelearnedinthecourseofexceptionhandling,eventhandling,smallapplicationsandgraphicaluserinterfacedesignisthepurposeofthisgraduationdesign.InthisgraduationprojectinmydesigntopicisbasedontheJavaNotepadappdesign.ThiscourseisdesignedtomeettheJavaspecificallydesignedtohelpstudentslearntomastertheJavalanguage,throughthegraduationprojectforstudentstobettergrasptheJavaprogrammingtool.ThedesignoftheuserJavaNotepadbasedonapprecordsandmakethemanagementofpersonaldiary,youcandisplaythedate,timetoremindtheusertodoanevent,canalsodobeforerecording,whenthebasicdatainsidetoomuchinformationcanbedeletedin.TheaboveisbasedonthegraduationoftheJavaNotepadapphasthemainfeatures.Keywords:android,java,app,目錄TOC\o"1-2"\h\z\u1緒論圖2-2所示,一系列驅(qū)動(dòng)模塊的底層效勞包括內(nèi)存管理機(jī)制,進(jìn)程管理機(jī)制,一些平安管理機(jī)制的提供是該層主要的功能,同時(shí)作抽象層連接軟件和硬件是Linux內(nèi)核的主要作用。圖2-2Linux內(nèi)核層2.2.2應(yīng)用程序框架層在創(chuàng)立應(yīng)用程序時(shí)各種需要使用的高級(jí)構(gòu)建塊應(yīng)用程序框架層都提供了。設(shè)計(jì)者想要訪問核心應(yīng)用程序所使用的API框架,設(shè)計(jì)人員可以很久設(shè)計(jì)的要求進(jìn)行訪問,當(dāng)然設(shè)計(jì)人員也可以擴(kuò)展該框架,只要根據(jù)設(shè)計(jì)的要求來(lái)擴(kuò)展就行應(yīng)用程序的框架如圖2-3所示。圖2-3應(yīng)用程序框架層2.3Android開發(fā)技術(shù)2.3.1Activity的生命周期如2—4所示對(duì)Activity的生命周期的流程進(jìn)行了詳細(xì)的解釋,如下三個(gè)關(guān)鍵的循環(huán)過(guò)程是一個(gè)Activity必須包含的:1、從開始調(diào)用Activity從onCreate(),最后onDestroy()結(jié)束調(diào)用,就是一個(gè)Activity的生命周期,初始化工作必須首先進(jìn)行,對(duì)資源的清理工作是放在周期的最后一步的。2、Activity的活動(dòng)周期是可視的。onStart()表示開始,onStop()就是程序結(jié)束,用戶可以在屏幕上看到它,不管這個(gè)過(guò)程中Activity有沒有和用戶進(jìn)行互動(dòng)。3、Activity后臺(tái)生命期是活動(dòng)的。后臺(tái)生命期是從onResume()到onPause()被調(diào)用結(jié)束,與用戶進(jìn)行互換,但是是在其期間內(nèi)的其它活動(dòng)之前。圖2-4Activity的生命周期2.3.2界面開發(fā)技術(shù)對(duì)于設(shè)計(jì)app系統(tǒng)來(lái)說(shuō)最根本的技術(shù)就是界面的開發(fā),界面的開發(fā)在幾乎所有的程序開發(fā)中都是需要的。合理、是否美觀的界面對(duì)客戶的體驗(yàn)是有直接的影響的,可以提高客戶體驗(yàn)對(duì)于好的用戶交互界面來(lái)說(shuō),能大大的提高APP的使用頻率。設(shè)計(jì)者通過(guò)XML技術(shù)來(lái)實(shí)現(xiàn)AndriodUI設(shè)計(jì),而布局是UI設(shè)計(jì)離不開的。相對(duì)布局、幀布局、線性布局、絕對(duì)布、表格布局是安卓設(shè)計(jì)系統(tǒng)中經(jīng)常使用的五個(gè)布局,是相互嵌套的這些布局之間,設(shè)計(jì)者可以非常靈活的使用,設(shè)計(jì)者很容易就開除一些比擬復(fù)雜的UI界面布局,當(dāng)然只要你的布局比擬合理。相對(duì)布局、線性布局、表格布局是本次的設(shè)計(jì)中所使用的。3需求分析3.1任務(wù)概述本次設(shè)計(jì)的目的是方便使用對(duì)對(duì)平時(shí)的時(shí)間進(jìn)行記錄,所有所設(shè)計(jì)的記事本軟件必須具備以下的功能:個(gè)人賬號(hào)的注冊(cè)是必須實(shí)現(xiàn)的可以添加以及記錄相關(guān)事件可以上傳視頻以及圖片實(shí)現(xiàn)時(shí)間的顯示等功能3.2功能需求用戶觸發(fā)事件必須先點(diǎn)擊屏幕才能進(jìn)行數(shù)據(jù)的互換。那些記事本上的相關(guān)按鈕就是操作請(qǐng)求的相關(guān)按鈕,屏幕的主要作用向用戶提供輸出的信息。每個(gè)事件就是來(lái)此操作人員的操作信息,如下表所示就是相關(guān)的出發(fā)事件,所有事件響應(yīng)及其執(zhí)行結(jié)果對(duì)于記事本系統(tǒng)中可能發(fā)生的都在下表中顯示。事件系統(tǒng)響應(yīng)執(zhí)行結(jié)果1點(diǎn)擊軟件系統(tǒng)從屏幕啟動(dòng)系統(tǒng),進(jìn)入該軟件,調(diào)用函數(shù)入口進(jìn)入該軟件,顯示記事列表2選擇添加記事,點(diǎn)擊Menu添加調(diào)用函數(shù)進(jìn)入添加界面3對(duì)其中一個(gè)記事點(diǎn)擊調(diào)用查看記事函數(shù)進(jìn)入詳細(xì)界面4點(diǎn)擊Menu在記事詳細(xì)界面,可進(jìn)行修改編輯記事修改函數(shù)調(diào)用進(jìn)入修改界面5在記事詳細(xì)界面點(diǎn)擊Menu,可對(duì)記事進(jìn)行刪除刪除函數(shù)調(diào)用刪除記事6選擇退出,點(diǎn)擊Menu在記事列表界面,退出函數(shù)調(diào)用退出軟件3.1.2記事本根本需求控制用戶眼中的系統(tǒng)就是系統(tǒng)用例圖來(lái)進(jìn)行描述的,即有哪些功能用戶希望系統(tǒng)擁有,以及完成這些功能需要通過(guò)哪些操作來(lái)進(jìn)行。用戶與系統(tǒng)交互的一種方式使用一個(gè)用例來(lái)表示。正如前面介紹過(guò)的,從參與者的角度分析系統(tǒng)就是識(shí)別用例的最好方法。在本次設(shè)計(jì)的Android記事本app系統(tǒng)中,用戶就是首先的參與者。如下列圖所示就是系統(tǒng)的E-R圖,該系統(tǒng)應(yīng)該具有何種功能它從用戶角度描述了。記事本記事本軟件設(shè)置視頻及圖片添加記事個(gè)人信息軟件設(shè)置視頻及圖片添加記事個(gè)人信息3-1記事本需求E-R圖4工程概要設(shè)計(jì)4.1功能模塊設(shè)計(jì)基于對(duì)記事本的功能進(jìn)行整體分析之后,設(shè)計(jì)了如圖4—1所示的功能模塊構(gòu)成。CalendarPadCalendarPadNotePadMonthNotePadMonthYearYear圖4-1系統(tǒng)模塊結(jié)構(gòu)圖4.2工程使用流程圖工程的使用流程,如圖4-2所示程序初始化開始程序初始化開始獲取當(dāng)前系統(tǒng)時(shí)間年份等數(shù)據(jù)獲取當(dāng)前系統(tǒng)時(shí)間年份等數(shù)據(jù)計(jì)算,繪制屏幕計(jì)算,繪制屏幕創(chuàng)立創(chuàng)立保存日記文件結(jié)束結(jié)束圖4-2使用流程圖4.3局部系統(tǒng)流程圖〔1〕以下就是此記事本系統(tǒng)的登錄流程圖〔如圖4-3〕圖4-3登錄流程圖〔2〕數(shù)據(jù)項(xiàng)工程的添加〔如圖4-4〕圖4-4添加數(shù)據(jù)項(xiàng)流程圖〔3〕數(shù)據(jù)項(xiàng)的刪除流程圖〔如圖4-5〕圖4-5刪除數(shù)據(jù)項(xiàng)流程圖4.4數(shù)據(jù)庫(kù)設(shè)計(jì)4.4.1數(shù)據(jù)庫(kù)概念設(shè)計(jì)根據(jù)用戶需求設(shè)計(jì)出的概念性數(shù)據(jù)模型就是數(shù)據(jù)庫(kù)的概念,通常用E-R模型表示,本設(shè)計(jì)數(shù)據(jù)庫(kù)的概念結(jié)構(gòu)如圖4-6所示:圖4-6E-R圖4.4.2數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)在數(shù)據(jù)庫(kù)設(shè)計(jì)中,數(shù)據(jù)庫(kù)的設(shè)計(jì)應(yīng)該標(biāo)準(zhǔn)合理。應(yīng)該合理規(guī)劃每個(gè)數(shù)據(jù)表,各個(gè)表中的屬性設(shè)計(jì)應(yīng)該詳細(xì)齊全,命名要標(biāo)準(zhǔn)?;跀?shù)據(jù)庫(kù)的概念設(shè)計(jì),對(duì)數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)設(shè)計(jì)如下:用戶信息(用戶名,用戶密碼〕事件(圖片,事件,時(shí)間,具體事項(xiàng)〕留言信息(留言內(nèi)容,留言者姓名,接收留言者姓名,留言時(shí)間〕具體實(shí)現(xiàn)如下表所示:表4-1用戶信息表字段名主鍵類型主鍵否描述useridint(11)是用戶idusernamevarchar(32)否用戶名passwordvarchar(32)否用戶密碼表4-3留言信息表字段名主鍵類型主鍵否描述messageidint(11)否idcontentvarchar(1024)否留言內(nèi)容usernamevarchar(1024)否留言者姓名receivenamevarchar(32)否接收留言者姓名leave_timetimestamp否留言時(shí)間表4-4收藏信息表5界面設(shè)計(jì)與功能實(shí)現(xiàn)5.1數(shù)據(jù)庫(kù)連接這是一款輕型的數(shù)據(jù)庫(kù)對(duì)于SQLite來(lái)說(shuō),屬于關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)是遵守ACID的,在一個(gè)相對(duì)小的C庫(kù)中包含了SQLite。它是公有領(lǐng)域工程由D.RichardHipp建立的。嵌入式是它的設(shè)計(jì)目標(biāo),而且目前已經(jīng)使用了它在很多嵌入式產(chǎn)品中,它占用非常低的資源,在嵌入式設(shè)備中,幾百K的內(nèi)存可能只需要。主流的操作系包括Windows/Linux/Unix它能夠支持,跟很多程序語(yǔ)言相結(jié)合同時(shí)能夠,他還擁有ODBC接口,同樣比起還有兩種世界著名數(shù)據(jù)庫(kù)管理系統(tǒng)Mysql、PostgreSQL,他們的處理速度還是比擬慢的。2000年5月SQLite第一個(gè)Alpha版本誕生。目前已經(jīng)開展了17年,后來(lái)SQLite3在2023年的時(shí)候發(fā)布了。個(gè)程序與之通信的獨(dú)立進(jìn)程對(duì)于SQLite引擎來(lái)說(shuō),跟一般的客戶-效勞器存在著一定的差距,而是成為它的一個(gè)主要局部通過(guò)連接到程序中去。所以是在編程語(yǔ)言內(nèi)的直接API調(diào)用對(duì)于主要的通信協(xié)議。它的是通過(guò)在開始一個(gè)事務(wù)的時(shí)候鎖定整個(gè)數(shù)據(jù)文件而完成的簡(jiǎn)單的設(shè)計(jì)。1.ACID相關(guān)的事務(wù)2.無(wú)需安裝和管理配置,就是零配置3.一個(gè)完整的數(shù)據(jù)庫(kù)儲(chǔ)存在單一磁盤文件中的4.不同字節(jié)順序的機(jī)器間可以自由的共享數(shù)據(jù)庫(kù)文件5.支持大小至2TB數(shù)據(jù)庫(kù)6.大致13萬(wàn)行C代碼,4.43M7.大局部普通數(shù)據(jù)庫(kù)操作要快比一些流行的數(shù)據(jù)庫(kù)在8.API簡(jiǎn)單,輕松9.TCL綁定功能具備,同時(shí)支持其他語(yǔ)言的綁定通過(guò)Wrapper10.注釋的源代碼良好,并且有測(cè)試覆蓋率90%以上11.沒有額外依賴,完全獨(dú)立12.完全開源的源碼,任何用途你都可以使用,包括商業(yè)性的13.支持多種開發(fā)語(yǔ)言先下載SQLite數(shù)據(jù)庫(kù)的JDBC這里給出一個(gè)中文站點(diǎn)的URL:將下載到的包解壓后得到j(luò)ar包sqlitejdbc-v033-nested.jar放到%JAVA_HOME%\lib下,并且將其添加classpath系統(tǒng)環(huán)境變量中,我的classpath系統(tǒng)環(huán)境變量為;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\sqlitejdbc-v033-nested.jar在你的代碼中引用這個(gè)驅(qū)動(dòng):Class.forName("org.sqlite.JDBC");Connectionconn=DriverManager.getConnection("jdbc:sqlite:filename");//filename為你的SQLite數(shù)據(jù)名稱//...usethedatabase...conn.close();}圖4.1記事本的界面設(shè)計(jì)packagecom.ironqin.note;importandroid.app.Activity;importandroid.content.Intent;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.AdapterView;importandroid.widget.AdapterView.OnItemClickListener;importandroid.widget.Button;importandroid.widget.ListView;publicclassMainActivityextendsActivityimplementsOnClickListener,OnItemClickListener{ privateButtonbtn_text,btn_photo,btn_video; privateListViewlistView; privateIntenti; privateMyAdaptermyAdapter; privateNotesDBnotesDB; privateSQLiteDatabasedbReader; privateSQLiteDatabasedbWriter; privateCursorcursor; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //clearDatabase();//初始化,將原有數(shù)據(jù)庫(kù)內(nèi)容清空 } publicvoidinitView(){ listView=(ListView)findViewById(R.id.list); btn_text=(Button)findViewById(R.id.button_text); btn_photo=(Button)findViewById(R.id.button_photo); btn_video=(Button)findViewById(R.id.button_video); btn_text.setOnClickListener(this); btn_photo.setOnClickListener(this); btn_video.setOnClickListener(this); listView.setOnItemClickListener(this); notesDB=newNotesDB(this); dbReader=notesDB.getReadableDatabase(); } @Override publicvoidonClick(Viewv){ i=newIntent(this,AddContent.class); switch(v.getId()){ caseR.id.button_text: i.putExtra("flag","1"); startActivity(i); break; caseR.id.button_photo: i.putExtra("flag","2"); startActivity(i); break; caseR.id.button_video: i.putExtra("flag","3"); startActivity(i); break; } } publicvoidselectDB(){ cursor=dbReader.query(NotesDB.TABLE_NAME,null,null,null,null,null,null); myAdapter=newMyAdapter(this,cursor); listView.setAdapter(myAdapter); } @Override protectedvoidonResume(){ super.onResume(); selectDB(); } @Override publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){ cursor.moveToPosition(position); Intentintent=newIntent(MainActivity.this,SelectAct.class); intent.putExtra(NotesDB.ID,cursor.getInt(cursor.getColumnIndex(NotesDB.ID))); intent.putExtra(NotesDB.CONTENT,cursor.getString(cursor.getColumnIndex(NotesDB.CONTENT))); intent.putExtra(NotesDB.TIME,cursor.getString(cursor.getColumnIndex(NotesDB.TIME))); intent.putExtra(NotesDB.PHOTO,cursor.getString(cursor.getColumnIndex(NotesDB.PHOTO))); intent.putExtra(NotesDB.VIDEO,cursor.getString(cursor.getColumnIndex(NotesDB.VIDEO))); startActivity(intent); } //清空數(shù)據(jù)庫(kù)操作 publicvoidclearDatabase(){ dbWriter=notesDB.getWritableDatabase(); dbWriter.delete(NotesDB.TABLE_NAME,null,null); }}6.2添加記事記事本最重要的功能無(wú)非就是事件的添加以及事件的刪除功能設(shè)計(jì),軟件設(shè)計(jì)如下列圖4.2圖4.2事件的添加packagecom.ironqin.note;importjava.io.File;importjava.sql.Date;importjava.text.SimpleDateFormat;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.content.ContentValues;importandroid.content.Intent;importandroid.database.sqlite.SQLiteDatabase;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.Uri;importandroid.os.Bundle;importandroid.os.Environment;importvider.MediaStore;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.ImageView;importandroid.widget.VideoView;@SuppressLint("SimpleDateFormat")publicclassAddContentextendsActivityimplementsOnClickListener{ privateStringval; privateButtonbtn_save,btn_giveup; privateImageViewimg_photo; privateVideoViewv_video; privateEditTextedit_content; privateFilephoto_file; privateFilevideo_file; privateNotesDBnotesDB; privateSQLiteDatabasedbWriter; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_content); val=getIntent().getStringExtra("flag"); btn_save=(Button)findViewById(R.id.button_save); btn_giveup=(Button)findViewById(R.id.button_giveup); img_photo=(ImageView)findViewById(R.id.img_photo); v_video=(VideoView)findViewById(R.id.v_video); edit_content=(EditText)findViewById(R.id.edit_content); btn_save.setOnClickListener(this); btn_giveup.setOnClickListener(this); v_video.setOnClickListener(this); notesDB=newNotesDB(this); dbWriter=notesDB.getWritableDatabase(); initView(); } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.button_save: addDB(); finish(); break; caseR.id.button_giveup: finish(); break; caseR.id.v_video: v_video.start(); break; } } publicvoidaddDB(){ ContentValuescontentValues=newContentValues(); contentValues.put(NotesDB.CONTENT,edit_content.getText().toString()); contentValues.put(NotesDB.TIME,getTime()); if(img_photo.getVisibility()==View.GONE) contentValues.put(NotesDB.PHOTO,"null"); else contentValues.put(NotesDB.PHOTO,photo_file+""); if(v_video.getVisibility()==View.GONE) contentValues.put(NotesDB.VIDEO,"null"); else contentValues.put(NotesDB.VIDEO,video_file+""); dbWriter.insert(NotesDB.TABLE_NAME,null,contentValues); } privateStringgetTime(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); java.util.Datedate=newjava.util.Date(); Stringstring=format.format(date); returnstring; } privateStringgetDocumentName(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy-mm-dd_HHmmss"); java.util.Datedate=newjava.util.Date(); Stringstring=format.format(date); returnstring; } publicvoidinitView(){ switch(val){ case"1"://文字 img_photo.setVisibility(View.GONE); v_video.setVisibility(View.GONE); break; case"2"://圖片+文字 img_photo.setVisibility(View.VISIBLE); v_video.setVisibility(View.GONE); Intentcamera=newIntent( MediaStore.ACTION_IMAGE_CAPTURE);//開啟系統(tǒng)相機(jī) photo_file=newFile(Environment.getExternalStorageDirectory() .getAbsoluteFile()+"/"+getDocumentName()+".jpg");//保存照片,只在數(shù)據(jù)庫(kù)中存儲(chǔ)地址 camera.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photo_file)); startActivityForResult(camera,1); break; case"3"://視頻+文字 img_photo.setVisibility(View.GONE); v_video.setVisibility(View.VISIBLE); Intentvideointent=newIntent( MediaStore.ACTION_VIDEO_CAPTURE); video_file=newFile(Environment.getExternalStorageDirectory() .getAbsoluteFile()+"/"+getDocumentName()+".mp4"); videointent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(video_file)); startActivityForResult(videointent,2); break; } } @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ //TODO自動(dòng)生成的方法存根 super.onActivityResult(requestCode,resultCode,data); if(requestCode==1){ Bitmapbitmap=BitmapFactory. decodeFile(photo_file.getAbsolutePath()); img_photo.setImageBitmap(bitmap); } if(requestCode==2){ v_video.setVideoURI(Uri.fromFile(video_file)); //v_video.start();//播放 } }}packagecom.ironqin.note;importandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.database.Cursor;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.media.ThumbnailUtils;importvider.MediaStore;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.ImageView;importandroid.widget.LinearLayout;importandroid.widget.TextView;@SuppressLint("ViewHolder")publicclassMyAdapterextendsBaseAdapter{ privateContextcontext; privateCursorcursor; privateLinearLayoutlayout; privateTextViewtv_content; privateTextViewtv_time; publicMyAdapter(Contextcontext,Cursorcursor){ this.context=context; this.cursor=cursor; } @Override publicintgetCount(){ returncursor.getCount(); } @Override publicObjectgetItem(intposition){ returnposition; } @Override publiclonggetItemId(intposition){ returncursor.getPosition(); } @SuppressLint("InflateParams") @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ LayoutInflaterinflater=LayoutInflater.from(context);//加載視圖的權(quán)限 layout=(LinearLayout)inflater.inflate(R.layout.cell,null);//視圖 tv_content=(TextView)layout.findViewById(R.id.content); tv_time=(TextView)layout.findViewById(R.id.time); ImageViewimg_photo=(ImageView)layout.findViewById(R.id.img_photo); ImageViewimg_video=(ImageView)layout.findViewById(R.id.img_video); cursor.moveToPosition(position); Stringcontent=cursor.getString(cursor.getColumnIndex("content")); Stringtime=cursor.getString(cursor.getColumnIndex("time")); Stringphoto=cursor.getString(cursor.getColumnIndex("photo")); Stringvideo=cursor.getString(cursor.getColumnIndex("video")); tv_content.setText(content); tv_time.setText(time); img_photo.setImageBitmap(getImageThumbnail(photo,200,200)); img_video.setImageBitmap(getVideoThumpnail(video,200,200, MediaStore.Images.Thumbnails.MICRO_KIND)); returnlayout; } //獲取圖片的縮略圖 publicBitmapgetImageThumbnail(Stringuri,intwidth,intheight){ Bitmapbitmap=null; BitmapFactory.Optionsoptions=newBitmapFactory.Options(); options.inJustDecodeBounds=true; bitmap=BitmapFactory.decodeFile(uri,options); options.inJustDecodeBounds=false; intbeWidth=options.outWidth/width; intbeHeight=options.outHeight/height; intbe=1; if(beWidth<beHeight) be=beWidth; else be=beHeight; if(be<=0) be=1; options.inSampleSize=be; bitmap=BitmapFactory.decodeFile(uri,options); bitmap=ThumbnailUtils.extractThumbnail(bitmap,width,height ,ThumbnailUtils.OPTIONS_RECYCLE_INPUT); returnbitmap; } privateBitmapgetVideoThumpnail(Stringuri,intwidth,intheight,intkind){ Bitmapbitmap=null; bitmap=ThumbnailUtils.createVideoThumbnail(uri,kind); bitmap=ThumbnailUtils.extractThumbnail(bitmap,width,height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT); returnbitmap; }}packagecom.ironqin.note;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;publicclassNotesDBextendsSQLiteOpenHelper{ publicNotesDB(Contextcontext){ super(context,"notes",null,1); //TODO自動(dòng)生成的構(gòu)造函數(shù)存根 //四個(gè)參數(shù)分別為context,數(shù)據(jù)庫(kù)名,版本號(hào) } publicstaticfinalStringTABLE_NAME="notes"; publicstaticfinalStringID="_id"; publicstaticfinalStringCONTENT="content"; publicstaticfinalStringTIME="time"; publicstaticfinalStringPHOTO="photo"; publicstaticfinalStringVIDEO="video"; @Override publicvoidonCreate(SQLiteDatabasedb){ //TODO自動(dòng)生成的方法存根 db.execSQL("createtable"+TABLE_NAME+"(" +ID+"integerprimarykeyautoincrement," +CONTENT+"textnotnull," +PHOTO+"text," +VIDEO+"text," +TIME+"textnotnull)"); } @Override publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ //TODO自動(dòng)生成的方法存根 }}6.3刪除/修改/刪除記事圖4.3事件的添加以及刪除packagecom.ironqin.note;importandroid.app.Activity;importandroid.content.Intent;importandroid.database.sqlite.SQLiteDatabase;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.Uri;importandroid.os.Bundle;importvider.MediaStore;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.ImageView;importandroid.widget.TextView;importandroid.widget.VideoView;publicclassSelectActextendsActivityimplementsOnClickListener{privateButtonbtn_delete,btn_back,btn_play;privateImageViewdetail_photo;privateVideoViewdetail_video;privateTextViewdetail_text;privateNotesDBnotes;privateSQLiteDatabasedbWriter;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_select);btn_delete=(Button)findViewById(R.id.button_delete);btn_back=(Button)findViewById(R.id.button_back);btn_play=(Button)findViewById(R.id.button_play);detail_photo=(ImageView)findViewById(R.id.detail_photo);detail_video=(VideoView)findViewById(R.id.detail_video);detail_text=(TextView)findViewById(R.id.detail_text);btn_delete.setOnClickListener(this);btn_back.setOnClickListener(this);btn_play.setOnClickListener(this);notes=newNotesDB(this);dbWriter=notes.getWritableDatabase();//修改權(quán)限if(getIntent().getStringExtra(NotesDB.PHOTO).equals("null")){//沒有圖片detail_photo.setVisibility(View.GONE);}else{detail_photo.setVisibility(View.VISIBLE);}if(getIntent().getStringExtra(NotesDB.VIDEO).equals("null")){//沒有視頻detail_video.setVisibility(View.GONE);}else{detail_video.setVisibility(View.VISIBLE);btn_play.setVisibility(View.VISIBLE);}detail_text.setText(getIntent().getStringExtra(NotesDB.CONTENT));Bitmapbitmap=BitmapFactory.decodeFile(getIntent().getStringExtra(NotesDB.PHOTO));detail_photo.setImageBitmap(bitmap);detail_video.setVideoURI(Uri.parse(getIntent().getStringExtra(NotesDB.VIDEO)));}@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.button_delete:deleteListView();finish();break;caseR.id.button_back:finish();break;caseR.id.button_play:detail_video.start();break;}}publicvoiddeleteListView(){dbWriter.delete(NotesDB.TABLE_NAME,"_id="+getIntent().getIntExtra(NotesDB.ID,0),null);}}packagecom.ironqin.note;importandroid.app.Activity;importandroid.content.Intent;importandroid.database.sqlite.SQLiteDatabase;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.Uri;importandroid.os.Bundle;importvider.MediaStore;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.ImageView;importandroid.widget.TextView;importandroid.widget.VideoView;publicclassSelectActextendsActivityimplementsOnClickListener{ privateButtonbtn_delete,btn_back,btn_play; privateImageViewdetail_photo; privateVideoViewdetail_video; privateTextViewdetail_text; privateNotesDBnotes; privateSQLiteDatabasedbWriter; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_select); btn_delete=(Button)findViewById(R.id.button_delete); btn_back=(Button)findViewById(R.id.button_back); btn_play=(Button)findViewById(R.id.button_play); detail_photo=(ImageView)findViewById(R.id.detail_photo); detail_video=(VideoView)findViewById(R.id.detail_video); detail_text=(TextView)findViewById(R.id.detail_text); btn_delete.setOnClickListener(this); btn_back.setOnClickListener(this); btn_play.setOnClickListener(this); notes=newNotesDB(this); dbWriter=notes.getWritableDatabase();//修改權(quán)限 if(getIntent().getStringExtra(NotesDB.PHOTO).equals("null")){//沒有圖片 detail_photo.setVisibility(View.GONE); } else{ detail_photo.setVisibility(View.VISIBLE); } if(getIntent().getStringExtra(NotesDB.VIDEO).equals("null")){//沒有視頻 detail_video.setVisibility(View.GONE); } else{ detail_video.setVisibility(View.VISIBLE); btn_play.setVisibility(View.VISIBLE); } detail_text.setText(getIntent().getStringExtra(NotesDB.CONTENT)); Bitmapbitmap=BitmapFactory.decodeFile(getIntent().getStringExtra(NotesDB.PHOTO)); detail_photo.setImageBitmap(bitmap); detail_video.setVideoURI(Uri.parse(getIntent().getStringExtra(NotesDB.VIDEO))); } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.button_delete: deleteListView(); finish(); break; caseR.id.button_back: finish(); break; caseR.id.button_play:detail_video.start(); break;} } publicvoiddeleteListView(){ dbWriter.delete(NotesDB.TABLE_NAME, "_id="+getIntent().getIntExtra(NotesDB.ID,0),null);}}packagecom.ironqin.note;importandroid.app.Activity;importandroid.content.Intent;importandroid.database.Cursor;importandroid.database.sqlite.SQLiteDatabase;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.AdapterView;importandroid.widget.AdapterView.OnItemClickListener;importandroid.widget.Button;importandroid.widget.ListView;publicclassMainActivityextendsActivityimplementsOnClickListener,OnItemClickListener{ privateButtonbtn_text,btn_photo,btn_video; privateListViewlistView; privateIntenti; privateMyAdaptermyAdapter; privateNotesDBnotesDB; privateSQLiteDatabasedbReader; privateSQLiteDatabasedbWriter; privateCursorcursor; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //clearDatabase();//初始化,將原有數(shù)據(jù)庫(kù)內(nèi)容清空 } publicvoidinitView(){ listView=(ListView)findViewById(R.id.list); btn_text=(Button)findViewById(R.id.button_text); btn_photo=(Button)findViewById(R.id.button_photo); btn_video=(Button)findViewById(R.id.button_video); btn_text.setOnClickListener(this); btn_photo.setOnClickListener(this); btn_video.setOnClickListener(this); listView.setOnItemClickListener(this); notesDB=newNotesDB(this); dbReader=notesDB.getReadableDatabase(); } @Override publicvoidonClick(Viewv){ i=newIntent(this,AddContent.class); switch(v.getId()){ caseR.id.button_text: i.putExtra("flag","1"); startActivity(i); break; caseR.id.button_photo: i.putExtra("flag","2"); startActivity(i); break; caseR.id.button_video: i.putExtra("flag","3"); startActivity(i); break; } } publicvoidselectDB(){ cursor=dbReader.query(NotesDB.TABLE_NAME,null,null,null,null,null,null); myAdapter=newMyAdapter(this,cursor); listView.setAdapter(myAdapter); } @Override protectedvoidonResume(){ super.onResume(); selectDB(); } @Override publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){ cursor.moveToPosition(position); Intentintent=newIntent(MainActivity.this,SelectAct.class); intent.putExtra(NotesDB.ID,cursor.getInt(cursor.getColumnIndex(NotesDB.ID))); intent.putExtra(NotesDB.CONTENT,cursor.getString(cursor.getColumnIndex(NotesDB.CONTENT))); intent.putExtra(NotesDB.TIME,cursor.getString(cursor.getColumnIndex(NotesDB.TIME))); intent.putExtra(NotesDB.PHOTO,cursor.getString(cursor.getColumnIndex(NotesDB.PHOTO))); intent.putExtra(NotesDB.VIDEO,cursor.getString(cursor.getColumnIndex(NotesDB.VIDEO))); startActivity(intent); } //清空數(shù)據(jù)庫(kù)操作 publicvoidclearDatabase(){ dbWriter=notesDB.getWritableDatabase(); dbWriter.delete(NotesDB.TABLE_NAME,null,null); }}importjava.io.File;importjava.sql.Date;importjava.text.SimpleDateFormat;importandroid.annotation.SuppressLint;importandroid.app.Activity;importandroid.content.ContentValues;importandroid.content.Intent;importandroid.database.sqlite.SQLiteDatabase;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.Uri;importandroid.os.Bundle;importandroid.os.Environment;importvider.MediaStore;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.ImageView;importandroid.widget.VideoView;@SuppressLint("SimpleDateFormat")publicclassAddContentextendsActivityimplementsOnClickListener{ privateStringval; privateButtonbtn_save,btn_giveup; privateImageViewimg_photo; privateVideoViewv_video; privateEditTextedit_content; privateFilephoto_file; privateFilevideo_file; privateNotesDBnotesDB; privateSQLiteDatabasedbWriter; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_add_content); val=getIntent().getStringExtra("flag"); btn_save=(Button)findViewById(R.id.button_save); btn_giveup=(Button)findViewById(R.id.button_giveup); img_photo=(ImageView)findViewById(R.id.img_photo); v_video=(VideoView)findViewById(R.id.v_video); edit_content=(EditText)findViewById(R.id.edit_content); btn_save.setOnClickListener(this); btn_giveup.setOnClickListener(this); v_video.setOnClickListener(this); notesDB=newNotesDB(this); dbWriter=notesDB.getWritableDatabase(); initView(); } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.button_save: addDB(); finish(); break; caseR.id.button_giveup: finish(); break; caseR.id.v_video: v_video.start(); break; } } publicvoidaddDB(){ ContentValuescontentValues=newContentValues(); contentValues.put(NotesDB.CONTENT,edit_content.getText().toString()); contentValues.put(NotesDB.TIME,getTime()); if(img_photo.getVisibility()==View.GONE) contentValues.put(NotesDB.PHOTO,"null"); else contentValues.put(NotesDB.PHOTO,photo_file+""); if(v_video.getVisibility()==View.GONE) contentValues.put(NotesDB.VIDEO,"null"); else contentValues.put(NotesDB.VIDEO,video_file+""); dbWriter.insert(NotesDB.TABLE_NAME,null,contentValues); } privateStringgetTime(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); java.util.Datedate=newjava.util.Date(); Stringstring=format.format(date); returnstring; } privateStringgetDocumentName(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy-mm-dd_HHmmss"); java.util.Datedate=newjava.util.Date(); Stringstring=format.format(date); returnstring; } publicvoidinitView(){ switch(val){ case"1"://文字 img_photo.setVisibility(View.GONE); v_video.setVisibility(View.GONE); break; case"2"://圖片+文字 img_photo.setVisibility(View.VISIBLE); v_video.setVisibility(View.GONE); Intentcamera=newIntent( MediaStore.ACTION_IMAGE_CAPTURE);//開啟系統(tǒng)相機(jī) photo_file=newFile(Environment.getExternalStorageDirectory() .getAbsoluteFile()+"/"+getDocumentName()+".jpg");//保存照片,只在數(shù)據(jù)庫(kù)中存儲(chǔ)地址 camera.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photo_file)); startActivityForResult(camera,1); break; case"3"://視頻+文字 img_photo.setVisibility(Vie
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南郴州市中考生物真題試題(含解析)
- 2024年公司貸款協(xié)議模板
- 2024年高效打井降水工程承包協(xié)議
- 2024年供應(yīng)商商業(yè)機(jī)密保護(hù)協(xié)議模板
- 2024年食用油批發(fā)銷售協(xié)議模板
- 2024建筑工程協(xié)議爭(zhēng)議處理辦法
- 2024醫(yī)療機(jī)構(gòu)食堂服務(wù)承包協(xié)議
- 2024年專業(yè)水暖工勞務(wù)協(xié)議模板
- 2024年一次性口罩生產(chǎn)合作協(xié)議模板
- 2024年有償借款協(xié)議范本
- 北京市道德與法治初一上學(xué)期期中試卷及答案指導(dǎo)(2024年)
- 高校實(shí)驗(yàn)室安全基礎(chǔ)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 四川省綿陽(yáng)市高中2025屆高三一診考試物理試卷含解析
- 油菜品種田間記載項(xiàng)目與標(biāo)準(zhǔn)
- 渣土車輛駕駛員管理制度
- 德力西系列變頻器說(shuō)明書
- 后疫情時(shí)代探索家校共育新模式維護(hù)學(xué)生心理健康
- 小學(xué)美術(shù)11-身邊的伙伴ppt課件
- 鐵合金生產(chǎn)工藝
- 焦化廠生產(chǎn)工序及工藝流程圖
- 汽車排放控制系統(tǒng)的檢修
評(píng)論
0/150
提交評(píng)論