安卓记事本开发报告_第1页
安卓记事本开发报告_第2页
安卓记事本开发报告_第3页
安卓记事本开发报告_第4页
安卓记事本开发报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Android平台记事本的设计与实现1.设计目的记事本的根本功能就是记事,用户首先用到的就是文本记事,输入事务信息以文本的形式展现出来,存储起来。随着用户需求的增加,可能希望用图形来代替文本来记事,用户之间翻开记事本,看到图片就能联系自己所记载的事务信息。这样免去了输入文字的麻烦,反而会更简单。又或者是文本与图片的交叉运用,可以让用户自己选择自己喜欢的记事方式,更加自由与便捷。所以此功能的意义是让简单的记事信息能以文本、图文和视频表达,更加丰富多彩。2.设计内容本设计的根本内容是在Android平台下,设计与实现记事本软件。具体要实现的功能是:

(1)设计实现添加“文字〞,“图文〞,“视频〞这三个主要的功能模块。(2)进入添加后,有“保存〞,“取消〞两种选择。(3)主页面显示记事列表,点击可查看及时内容,并有“删除〞,“返回〞两种选择。(4)进行测试并分析结果。3.开发环境的安装与配置3.1Android开发平台搭建本设计主要是以Eclipse为根底,安装SDK和ADT插件后,用来开发安卓工程。开发平台搭建步骤介绍如下。〔1)下载JDK并安装,安装后配置环境变量。〔2)下载Eclipse解压至指定文件夹。〔3〕下载SDK后解压至指定文件夹,翻开SDK目录,点击SDKManager安装开发安卓工程需要的包。〔4〕启动Eclipse,进入Help—>InstallNewSoftware—>Add,添加ADT插件。〔5〕进入Window—>Android—>Browse,选择SDK安装目录。3.2硬件环境Android设备,如Android或平板电脑,主频在1Ghz及以上,内存为512MB以上,系统版本为Android2.1及以上。本设计使用Android4.4.4的。3.3软件环境操作系统:windows10IDE:EclipseAndroidSDK集成环境4.设计主体架构4.1src文件夹src文件夹下com.liwenhuan.notepad包下为系统主要Activity类:NotesDB.java是进行数据储存的,通过SQLite保存数据。并且用onCreate函数创立数据库。通过设置两个按钮的监听来实现对输入文本的存储或退出。MainActivity.java是主Activity,通过设置三个按钮的监听来实现添加文本、图文、视频的记事方式。AddContent.java通过initView方法来判断记事的方式,实现对文本、图片、视频的添加,获取保存文件的时间。MyAdapter.java是显示模块,通过系统提供的Bitmap在记事列表显示图片和视频的缩略图。SelectAct.java是记事详情的显示模块,通过监听的方法来实现记事的删除功能。4.2gen文件夹

gen文件夹是工程自动生成的文件夹R.java是工程下各个资源的标识符负责所有资源的索引。

4.3bin文件夹

bin文件夹是编译后的字节码存放的目录,编译的过程首先是编译成为android

java虚拟机文件classes.dex,再打包成APK格式的包。

4.4res文件夹

Res是资源目录,它包含工程中的资源文件并将其编译进应用程序中,向此目录添加资源时,会被R.java自动记录。res目录存放所有程序中用到的资源文件。“资源文件〞指的资料文件、图片等。子目录有:drawable、layout、values。本设计主要用了layout目录下的布局文件。layout是屏幕布局目录,activity_main.xml是主界面的布局文件、addcontent.xml是增加数据页面的布局文件、cell.xml是几个功能按钮的布局文件、select.xml是显示记事详情以及对记事进行操作的布局文件。5.程序设计5.1数据存储之SQLite这个方法在数据保存中非常常用,只是它只会被一个程序读取数据,不能在不同程序间共享数据。//创立数据库publicvoidonCreate(SQLiteDatabasedb){db.execSQL("CREATETABLE"+TABLE_NAME+"("+ID +"INTEGERPRIMARYKEYAUTOINCREMENT,"+CONTENT +"TEXTNOTNULL,"+PATH+"TEXTNOTNULL,"+VIDEO+"TEXTNOTNULL,"+TIME+"TEXTNOTNULL)");}5.2添加文字内容当以文本方式记事时,需要对输入的文字内容进行保存。publicvoidinitView(){if(val.equals("1")){//文字c_img.setVisibility(View.GONE);//隐藏v_video.setVisibility(View.GONE);//隐藏 }}publicvoidonClick(Viewv){switch(v.getId()){caseR.id.save:addDB();//添加数据 finish();//关闭当前Activitybreak;caseR.id.delete: finish();break; }}5.3适配器配置publicclassMyAdapterextendsBaseAdapter{privateContextcontext;privateCursorcursor;privateLinearLayoutlayout;//视图对象publicMyAdapter(Contextcontext,Cursorcursor){this.context=context;this.cursor=cursor; }@OverridepublicintgetCount(){returncursor.getCount();//返回长度 }@OverridepublicObjectgetItem(intposition){returncursor.getPosition(); }@OverridepubliclonggetItemId(intposition){returnposition; }publicViewgetView(intposition,ViewconvertView,ViewGroupparent){LayoutInflaterinflater=LayoutInflater.from(context);//加载视图的权限layout=(LinearLayout)inflater.inflate(R.layout.cell,null);//布局文件TextViewcontenttv=(TextView)layout.findViewById(R.id.list_content);//获取上面布局文件中的每一个内容TextViewtimetv=(TextView)layout.findViewById(R.id.list_time);//查找时间ImageViewimgiv=(ImageView)layout.findViewById(R.id.list_img);//查找图片ImageViewvideoiv=(ImageView)layout.findViewById(R.id.list_video);//查找视频cursor.moveToPosition(position);//查询 Stringcontent=cursor.getString(cursor.getColumnIndex("content"));//获取具体内容 Stringtime=cursor.getString(cursor.getColumnIndex("time"));//获取时间 Stringurl=cursor.getString(cursor.getColumnIndex("path"));//获取图片的缩略图 Stringurlvideo=cursor.getString(cursor.getColumnIndex("video"));//获取视频contenttv.setText(content);//将内容传递进来timetv.setText(time);//将时间传递进来videoiv.setImageBitmap(getVideoThumbnail(urlvideo,200,200,MediaStore.Images.Thumbnails.MICRO_KIND));//在列表显示视频缩略图imgiv.setImageBitmap(getImageThumbnail(url,200,200));//在列表显示图片缩略图returnlayout; }5.4添加图片和视频 在本设计中,不仅提供了以文本方式进行记事,还提供了以图片和视频方式进行记事。publicvoidinitView(){if(val.equals("2")){//图片c_img.setVisibility(View.VISIBLE);//显示v_video.setVisibility(View.GONE);//隐藏Intentiimg=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);//跳转到系统相机phoneFile=newFile(Environment.getExternalStorageDirectory() .getAbsoluteFile()+"/"+getTime()+".jpg");//获取SD卡绝对路径iimg.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(phoneFile));//存储获取的图片信息startActivityForResult(iimg,1);//启动跳转}if(val.equals("3")){c_img.setVisibility(View.GONE);//隐藏v_video.setVisibility(View.VISIBLE);//显示Intentvideo=newIntent(MediaStore.ACTION_VIDEO_CAPTURE);//跳转到系统信息videoFile=newFile(Environment.getExternalStorageDirectory() .getAbsoluteFile()+"/"+getTime()+".mp4");//获取SD卡绝对路径video.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(videoFile));//存储获取的video信息startActivityForResult(video,2);//启动跳转}}//显示图片或视频protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){//TODOAuto-generatedmethodstubsuper.onActivityResult(requestCode,resultCode,data);if(requestCode==1){//图片Bitmapbitmap=BitmapFactory.decodeFile(phoneFile .getAbsolutePath());//获取路径c_img.setImageBitmap(bitmap);//展示内容}if(requestCode==2){//视频v_video.setVideoURI(Uri.fromFile(videoFile));//加载视频v_video.start();//播放视频}}5.5获取图片和视频的缩略图 当我们用图片或制品进行记事时,在列表中需要显示其缩略图,可以用系统提供的Bitmap进行处理。//获取图片的缩略图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; }//获取视频的缩略图privateBitmapgetVideoThumbnail(Stringuri,intwidth,intheight,intkind){ Bitmapbitmap=null;bitmap=ThumbnailUtils.createVideoThumbnail(uri,kind);bitmap=ThumbnailUtils.extractThumbnail(bitmap,width,height,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);returnbitmap; }5.7详情页显示protectedvoidonCreate(BundlesavedInstanceState){//TODOAuto-generatedmethodstubsuper.onCreate(savedInstanceState);setContentView(R.layout.select);//加载详情//(getIntent().getIntExtra(NotesDB.ID,0));s_delete=(Button)findViewById(R.id.s_delete);s_back=(Button)findViewById(R.id.s_back);s_img=(ImageView)findViewById(R.id.s_img);s_video=(VideoView)findViewById(R.id.s_video);s_tv=(TextView)findViewById(R.id.s_tv);notesDB=newNotesDB(this);dbWriter=notesDB.getWritableDatabase();//获取写权限s_back.setOnClickListener(this);s_delete.setOnClickListener(this);//如果图片为空,那么隐藏,否那么显示if(getIntent().getStringExtra(NotesDB.PATH).equals("null")){s_img.setVisibility(View.GONE); }else{s_img.setVisibility(View.VISIBLE); }if(getIntent().getStringExtra(NotesDB.VIDEO).equals("null")){s_video.setVisibility(View.GONE); }else{s_video.setVisibility(View.VISIBLE); }s_tv.setText(getIntent().getStringExtra(NotesDB.CONTENT));//加载TextView的文字信息 Bitmapbitmap=BitmapFactory.decodeFile(getIntent().getStringExtra(NotesDB.PATH));//加载图片信息s_img.setImageBitmap(bitmap);//显示图片信息s_video.setVideoURI(Uri .parse(getIntent().getStringExtra(NotesDB.VIDEO)));s_video.start();//播放视频 }6.测试6.1虚拟设备AVD测试〔1〕主界面显示如图6.1所示。〔2〕记事页面显示如图6.2所示。图6.1图6.2〔3〕记事列表显示如图6.3所示。〔4〕记事详情显示如图6.4所示。图6.3图6.46.2真机测试将记事本的apk文件导进,安装后进行测试,测试结果如下:〔1〕添加好内容后,记事本的记事列表显示如图6.5所示。〔2〕以文本方式添加记事,详情显示如图6.6所示。图6.5图6.6〔3〕以图文方式添加记事,内容详情页显示如图6.7。〔4〕以视频结合文字方式添加记事,内容详情页显示如图6.8。图6.7图6.87.总结通过此次设计过程我会到了许多知识,在这个过程中遇到了许多困难,比方SDK和ADT的版本不能兼容,记事本工程可以在虚拟设备中运行,在真机上测试时却出现了问题,不能读取图片和视频,通过在网上查找资料,发现是虽然在代码中对SD卡添加了读取权限,但没有在AndroidMainfest.xml中添加对SD卡的读取权限,所以出现了如上的错误。通过不断的发现问题,总结问题和解决问题的过程,使我对Android的认识不断的提高,得到了珍贵的经验。代码:MainActivity.javapackage;//采用接口方式publicclassMainActivityextendsActivityimplementsOnClickListener{ privateButtontextbtn,imgbtn,videobtn;//声明三个button privateListViewlv;//创立listview privateIntenti;//通过intent来创立标识 privateMyAdapteradapter; privateNotesDBnotesDB;//数据库对象 privateSQLiteDatabasedbReader;//获取读取权限 privateCursorcursor; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView();//调用初始化方法 } //初始化 publicvoidinitView(){ lv=(ListView)findViewById(R.id.list);//找id操作 textbtn=(Button)findViewById(R.id.text);//找文字 imgbtn=(Button)findViewById(R.id.img);//找图片 videobtn=(Button)findViewById(R.id.video);//找视频 textbtn.setOnClickListener(this);//添加监听事件 imgbtn.setOnClickListener(this); videobtn.setOnClickListener(this); notesDB=newNotesDB(this);//数据库实例化 dbReader=notesDB.getReadableDatabase();//获取读取权限 //获取记事详情 lv.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>parent,Viewview, intposition,longid){ cursor.moveToPosition(position); Intenti=newIntent(MainActivity.this,SelectAct.class); i.putExtra(NotesDB.ID, cursor.getInt(cursor.getColumnIndex(NotesDB.ID)));//获取ID i.putExtra(NotesDB.CONTENT,cursor.getString(cursor .getColumnIndex(NotesDB.CONTENT)));//获取内容 i.putExtra(NotesDB.TIME, cursor.getString(cursor.getColumnIndex(NotesDB.TIME)));//获取时间 i.putExtra(NotesDB.PATH, cursor.getString(cursor.getColumnIndex(NotesDB.PATH)));//获取图片 i.putExtra(NotesDB.VIDEO, cursor.getString(cursor.getColumnIndex(NotesDB.VIDEO)));//获取视频 startActivity(i);//跳转到详情页 } }); } //添加一个复写方法 @Override publicvoidonClick(Viewv){ i=newIntent(this,AddContent.class);//实例化操作 switch(v.getId()){ caseR.id.text: i.putExtra("flag","1"); startActivity(i);//跳转至AddContent.java break; caseR.id.img: i.putExtra("flag","2"); startActivity(i); break; caseR.id.video: i.putExtra("flag","3"); startActivity(i); break; } } publicvoidselectDB(){ cursor=dbReader.query(NotesDB.TABLE_NAME,null,null,null,null, null,null); adapter=newMyAdapter(this,cursor); lv.setAdapter(adapter); } @Override protectedvoidonResume(){ super.onResume(); selectDB(); }}NotesDB.javapackage;publicclassNotesDBextendsSQLiteOpenHelper{ publicstaticfinalStringTABLE_NAME="notes";//指定名称 publicstaticfinalStringCONTENT="content";//内容 publicstaticfinalStringPATH="path";//图片 publicstaticfinalStringVIDEO="video";//视频 publicstaticfinalStringID="_id";//创立id publicstaticfinalStringTIME="time";//当前保存文本的时间 //复写一个构造方法 publicNotesDB(Contextcontext){ super(context,"notes",null,1);//super返回值〔context,库名,null,版本号〕 } @Override //创立数据库 publicvoidonCreate(SQLiteDatabasedb){ //创立 db.execSQL("CREATETABLE"+TABLE_NAME+"("+ID +"INTEGERPRIMARYKEYAUTOINCREMENT,"+CONTENT +"TEXTNOTNULL,"+PATH+"TEXTNOTNULL,"+VIDEO +"TEXTNOTNULL,"+TIME+"TEXTNOTNULL)"); } @Override //更新数据库,当前需求,不需要更新 publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ }}AddContent.javapackage;publicclassAddContentextendsActivityimplementsOnClickListener{ privateStringval;//用于接收MainActivity中的跳转的定义 privateButtonsavebtn,deletebtn; privateEditTextettext; privateImageViewc_img; privateVideoViewv_video;//用来播放视频 privateNotesDBnotesDB;//创立数据库对象 privateSQLiteDatabasedbWriter; privateFilephoneFile,videoFile; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.addcontent);//绑定视图 val=getIntent().getStringExtra("flag");//接收完成 savebtn=(Button)findViewById(R.id.save);//寻找id deletebtn=(Button)findViewById(R.id.delete); ettext=(EditText)findViewById(R.id.ettext); c_img=(ImageView)findViewById(R.id.c_img); v_video=(VideoView)findViewById(R.id.c_video); savebtn.setOnClickListener(this);//监听事件 deletebtn.setOnClickListener(this); notesDB=newNotesDB(this);//实例化 dbWriter=notesDB.getWritableDatabase(); initView(); } //判断是否显示 publicvoidinitView(){ if(val.equals("1")){//文字 c_img.setVisibility(View.GONE);//隐藏 v_video.setVisibility(View.GONE);//隐藏 } if(val.equals("2")){//图片 c_img.setVisibility(View.VISIBLE);//显示 v_video.setVisibility(View.GONE);//隐藏 Intentiimg=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);//跳转到系统相机 phoneFile=newFile(Environment.getExternalStorageDirectory() .getAbsoluteFile()+"/"+getTime()+".jpg");//获取SD卡绝对路径,照片储存在SD卡中,数据库中只存储路径 iimg.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(phoneFile));//存储获取的图片信息 startActivityForResult(iimg,1);//启动跳转 } if(val.equals("3")){ c_img.setVisibility(View.GONE);//隐藏 v_video.setVisibility(View.VISIBLE);//显示 Intentvideo=newIntent(MediaStore.ACTION_VIDEO_CAPTURE);//跳转到系统信息 videoFile=newFile(Environment.getExternalStorageDirectory() .getAbsoluteFile()+"/"+getTime()+".mp4");//获取SD卡绝对路径 video.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(videoFile));//存储获取的video信息 startActivityForResult(video,2);//启动跳转 } } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.save: addDB();//添加数据 finish();//关闭当前Activity break; caseR.id.delete: finish(); break; } } //添加数据 publicvoidaddDB(){ ContentValuescv=newContentValues();//实例化 cv.put(NotesDB.CONTENT,ettext.getText().toString());//添加内容〔在输入框中获取到的〕 cv.put(NotesDB.TIME,getTime());//调用方法获取时间并添加 cv.put(NotesDB.PATH,phoneFile+"");//将获取的图片信息插入数据库中 cv.put(NotesDB.VIDEO,videoFile+"");//将获取的vedio信息插入数据库中 dbWriter.insert(NotesDB.TABLE_NAME,null,cv);//将上面添加的数据插入数据库中 } //获取保存文件时的时间 privateStringgetTime(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy年MM月dd日HH:mm:ss"); DatecurDate=newDate(); Stringstr=format.format(curDate);//按指定的格式获取时间 returnstr; } @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ //TODOAuto-generatedmethodstub super.onActivityResult(requestCode,resultCode,data); if(requestCode==1){//图片 Bitmapbitmap=BitmapFactory.decodeFile(phoneFile .getAbsolutePath());//获取路径 c_img.setImageBitmap(bitmap);//展示内容 } if(requestCode==2){//视频 v_video.setVideoURI(Uri.fromFile(videoFile));//加载视频 v_video.start();//播放视频 } }}MyAdapter.javapackage;publicclassMyAdapterextendsBaseAdapter{ privateContextcontext; privateCursorcursor; privateLinearLayoutlayout;//视图对象 //构造方法 publicMyAdapter(Contextcontext,Cursorcursor){ this.context=context; this.cursor=cursor; } @Override publicintgetCount(){ returncursor.getCount();//返回长度 } @Override publicObjectgetItem(intposition){ returncursor.getPosition(); } @Override publiclonggetItemId(intposition){ //TODOAuto-generatedmethodstub returnposition; } publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ LayoutInflaterinflater=LayoutInflater.from(context);//加载试图的权限 layout=(LinearLayout)inflater.inflate(R.layout.cell,null);//布局文件 TextViewcontenttv=(TextView)layout.findViewById(R.id.list_content);//获取上条布局文件中的每一个内容 TextViewtimetv=(TextView)layout.findViewById(R.id.list_time);//显示时间 ImageViewimgiv=(ImageView)layout.findViewById(R.id.list_img);//显示图片 ImageViewvideoiv=(ImageView)layout.findViewById(R.id.list_video);//显示视频 cursor.moveToPosition(position);//查询 Stringcontent=cursor.getString(cursor.getColumnIndex("content"));//承载查询到的具体内容 Stringtime=cursor.getString(cursor.getColumnIndex("time"));//获取时间 Stringurl=cursor.getString(cursor.getColumnIndex("path"));//获取图片的缩略图 Stringurlvideo=cursor.getString(cursor.getColumnIndex("video"));//获取视频 contenttv.setText(content);//将内容传递进来 timetv.setText(time);//将时间传递进来 videoiv.setImageBitmap(getVideoThumbnail(urlvideo,200,200, MediaStore.Images.Thumbnails.MICRO_KIND));//在列表显示视频缩略图imgiv.setImageBitmap(getImageThumbnail(url,200,200));//在列表显示图片缩略图 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; } //获取视频的缩略图 privateBitmapgetVideoThumbnail(Stringuri,intwidth,intheight,intkind){ Bitmapbitmap=null; bitmap=ThumbnailUtils.createVideoThumbnail(uri,kind); bitmap=ThumbnailUtils.extrac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论