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

下载本文档

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

文档简介

基于Android平台记事本的设计与实现 1.设计目的记事本的基本功能就是记事,手机用户首先用到的就是文本记事,输入事务信息以文本的形式展现出来,存储起来。随着用户需求的增加,可能希望用图形来代替文本来记事,用户之间打开记事本,看到图片就能联系自己所记载的事务信息。这样免去了输入文字的麻烦,反而会更简单。又或者是文本与图片的交叉运用,可以让用户自己选择自己喜欢的记事方式,更加自由与便捷。所以此功能的意义是让简单的记事信息能以文本、图文和视频表达,更加丰富多彩。2.设计内容本设计的基本内容是在Android平台下,设计与实现记事本软件。具体要实现的功能是:(1)设计实现添加“文字”,“图文”,“视频”这三个主要的功能模块。(2)进入添加后,有“保存”,“取消”两种选择。(3)主页面显示记事列表,点击可查看及时内容,并有“删除”,“返回”两种选择。(4)进行测试并分析结果。3.开发环境的安装与配置3.1 Android开发平台搭建本设计主要是以Eclipse为基础,安装SDK和ADT插件后,用来开发安卓项目。开发平台搭建步骤介绍如下。 (1)下载JDK并安装,安装后配置环境变量。(2)下载Eclipse解压至指定文件夹。(3)下载SDK后解压至指定文件夹,打开SDK目录,点击SDK Manager安装开发安卓项目需要的包。(4)启动Eclipse,进入HelpInstall New SoftwareAdd,添加ADT插件。(5)进入WindowAndroidBrowse,选择SDK安装目录。3.2硬件环境Android设备,如Android手机或平板电脑,主频在1Ghz及以上,内存为512MB以上,系统版本为Android2.1及以上。本设计使用Android4.4.4的手机。3.3 软件环境操作系统:windows10IDE:EclipseAndroid SDK 集成环境4.设计主体架构4.1 src文件夹src文件夹下com.liwenhuan.notepad包下为系统主要Activity类:NotesDB.java是进行数据储存的,通过SQLite保存数据。并且用onCreate函数创建数据库。通过设置两个按钮的监听来实现对输入文本的存储或退出。MainActivity.java是主Activity,通过设置三个按钮的监听来实现添加文本、图文、视频的记事方式。AddContent.java通过initView方法来判断记事的方式,实现对文本、图片、视频的添加,获取保存文件的时间。MyAdapter.java是显示模块,通过系统提供的Bitmap在记事列表显示图片和视频的缩略图。SelectAct.java是记事详情的显示模块,通过监听的方法来实现记事的删除功能。4.2 gen文件夹gen文件夹是项目自动生成的文件夹R.java是工程下各个资源的标识符负责所有资源的索引。4.3 bin文件夹bin文件夹是编译后的字节码存放的目录,编译的过程首先是编译成为androidjava虚拟机文件classes.dex,再打包成APK格式的包。4.4 res文件夹Res是资源目录,它包含项目中的资源文件并将其编译进应用程序中,向此目录添加资源时,会被R.java自动记录。res目录存放所有程序中用到的资源文件。“资源文件”指的资料文件、图片等。子目录有:drawable、layout、values。本设计主要用了layout目录下的布局文件。layout是屏幕布局目录, activity_main.xml是主界面的布局文件、addcontent.xml是增加数据页面的布局文件、cell.xml是几个功能按钮的布局文件、select.xml是显示记事详情以及对记事进行操作的布局文件。5.程序设计5.1数据存储之SQLite这个方法在数据保存中非常常用,只是它只会被一个程序读取数据,不能在不同程序间共享数据。/创建数据库public void onCreate(SQLiteDatabase db) db.execSQL(CREATE TABLE + TABLE_NAME + ( + ID+ INTEGER PRIMARY KEY AUTOINCREMENT, + CONTENT+ TEXT NOT NULL, + PATH + TEXT NOT NULL, + VIDEO+ TEXT NOT NULL, + TIME + TEXT NOT NULL);5.2 添加文字内容当以文本方式记事时,需要对输入的文字内容进行保存。public void initView() if (val.equals(1) / 文字c_img.setVisibility(View.GONE);/隐藏v_video.setVisibility(View.GONE);/隐藏public void onClick(View v) switch (v.getId() case R.id.save:addDB();/添加数据finish();/关闭当前Activitybreak;case R.id.delete:finish();break;5.3适配器配置public class MyAdapter extends BaseAdapter private Context context;private Cursor cursor;private LinearLayout layout;/视图对象public MyAdapter(Context context, Cursor cursor) this.context = context;this.cursor = cursor;Overridepublic int getCount() return cursor.getCount();/返回长度Overridepublic Object getItem(int position) return cursor.getPosition();Overridepublic long getItemId(int position) return position;public View getView(int position, View convertView, ViewGroup parent) LayoutInflater inflater = LayoutInflater.from(context);/加载视图的权限layout = (LinearLayout) inflater.inflate(R.layout.cell, null);/布局文件TextView contenttv = (TextView) layout.findViewById(R.id.list_content);/获取上面布局文件中的每一个内容TextView timetv = (TextView) layout.findViewById(R.id.list_time);/查找时间ImageView imgiv = (ImageView) layout.findViewById(R.id.list_img);/查找图片ImageView videoiv = (ImageView) layout.findViewById(R.id.list_video);/查找视频cursor.moveToPosition(position);/查询String content = cursor.getString(cursor.getColumnIndex(content);/获取具体内容String time = cursor.getString(cursor.getColumnIndex(time);/获取时间String url = cursor.getString(cursor.getColumnIndex(path);/获取图片的缩略图String urlvideo = 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);/在列表显示图片缩略图return layout;5.4添加图片和视频在本设计中,不仅提供了以文本方式进行记事,还提供了以图片和视频方式进行记事。public void initView() if (val.equals(2) /图片c_img.setVisibility(View.VISIBLE);/显示v_video.setVisibility(View.GONE);/隐藏Intent iimg = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);/跳转到系统相机phoneFile = new File(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);/显示Intent video = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);/跳转到手机系统信息videoFile = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + / + getTime() + .mp4);/获取SD卡绝对路径video.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(videoFile);/存储获取的video信息startActivityForResult(video, 2);/启动跳转/显示图片或视频protected void onActivityResult(int requestCode, int resultCode, Intent data) / TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (requestCode = 1) /图片Bitmap bitmap = BitmapFactory.decodeFile(phoneFile.getAbsolutePath();/获取路径c_img.setImageBitmap(bitmap);/展示内容if (requestCode = 2) /视频v_video.setVideoURI(Uri.fromFile(videoFile);/加载视频v_video.start();/播放视频5.5 获取图片和视频的缩略图当我们用图片或制品进行记事时,在列表中需要显示其缩略图,可以用系统提供的Bitmap进行处理。/获取图片的缩略图public Bitmap getImageThumbnail(String uri, int width, int height) Bitmap bitmap = null;BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;bitmap = BitmapFactory.decodeFile(uri, options);options.inJustDecodeBounds = false;int beWidth = options.outWidth / width;int beHeight = options.outHeight / height;int be = 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);return bitmap;/获取视频的缩略图private Bitmap getVideoThumbnail(String uri, int width, int height, int kind) Bitmap bitmap = null;bitmap = ThumbnailUtils.createVideoThumbnail(uri, kind);bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,ThumbnailUtils.OPTIONS_RECYCLE_INPUT);return bitmap;5.7详情页显示protected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.select);/加载详情/ System.out.println(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 = new NotesDB(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的文字信息Bitmap bitmap = 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 com.liwenhuan.notepad;/采用接口方式public class MainActivity extends Activity implements OnClickListener private Button textbtn, imgbtn, videobtn;/声明三个buttonprivate ListView lv; /创建listviewprivate Intent i;/通过intent来创建标识private MyAdapter adapter;private NotesDB notesDB;/数据库对象private SQLiteDatabase dbReader;/获取读取权限private Cursor cursor;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();/调用初始化方法/初始化public void initView() 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 = new NotesDB(this);/数据库实例化dbReader = notesDB.getReadableDatabase();/获取读取权限/获取记事详情lv.setOnItemClickListener(new OnItemClickListener() Overridepublic void onItemClick(AdapterView parent, View view,int position, long id) cursor.moveToPosition(position);Intent i = new Intent(MainActivity.this, SelectAct.class);i.putExtra(NotesDB.ID,cursor.getInt(cursor.getColumnIndex(NotesDB.ID);/获取IDi.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);/跳转到详情页);/添加一个复写方法Overridepublic void onClick(View v) i = new Intent(this, AddContent.class);/实例化操作switch (v.getId() case R.id.text:i.putExtra(flag, 1);startActivity(i);/跳转至AddContent.javabreak;case R.id.img:i.putExtra(flag, 2);startActivity(i);break;case R.id.video:i.putExtra(flag, 3);startActivity(i);break;public void selectDB() cursor = dbReader.query(NotesDB.TABLE_NAME, null, null, null, null,null, null);adapter = new MyAdapter(this, cursor);lv.setAdapter(adapter);Overrideprotected void onResume() super.onResume();selectDB();NotesDB.javapackage com.liwenhuan.notepad;public class NotesDB extends SQLiteOpenHelper public static final String TABLE_NAME = notes;/指定名称public static final String CONTENT = content;/内容public static final String PATH = path;/图片public static final String VIDEO = video;/视频public static final String ID = _id;/创建idpublic static final String TIME = time;/当前保存文本的时间/复写一个构造方法public NotesDB(Context context) super(context, notes, null, 1);/super返回值(context,库名,null,版本号)Override/创建数据库public void onCreate(SQLiteDatabase db) /创建db.execSQL(CREATE TABLE + TABLE_NAME + ( + ID+ INTEGER PRIMARY KEY AUTOINCREMENT, + CONTENT+ TEXT NOT NULL, + PATH + TEXT NOT NULL, + VIDEO+ TEXT NOT NULL, + TIME + TEXT NOT NULL);Override/更新数据库,当前需求,不需要更新public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) AddContent.javapackage com.liwenhuan.notepad;public class AddContent extends Activity implements OnClickListener private String val;/用于接收MainActivity中的跳转的定义private Button savebtn, deletebtn;private EditText ettext;private ImageView c_img;private VideoView v_video;/用来播放视频private NotesDB notesDB;/创建数据库对象private SQLiteDatabase dbWriter;private File phoneFile, videoFile;Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.addcontent);/绑定视图val = getIntent().getStringExtra(flag);/接收完成savebtn = (Button) findViewById(R.id.save);/寻找iddeletebtn = (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 = new NotesDB(this);/实例化dbWriter = notesDB.getWritableDatabase();initView();/判断是否显示public void initView() 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);/隐藏Intent iimg = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);/跳转到系统相机phoneFile = new File(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);/显示Intent video = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);/跳转到手机系统信息videoFile = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + / + getTime() + .mp4);/获取SD卡绝对路径video.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(videoFile);/存储获取的video信息startActivityForResult(video, 2);/启动跳转Overridepublic void onClick(View v) switch (v.getId() case R.id.save:addDB();/添加数据finish();/关闭当前Activitybreak;case R.id.delete:finish();break;/添加数据public void addDB() ContentValues cv = new ContentValues();/实例化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);/将上面添加的数据插入数据库中/获取保存文件时的时间private String getTime() SimpleDateFormat format = new SimpleDateFormat(yyyy年MM月dd日 HH:mm:ss);Date curDate = new Date();String str = format.format(curDate);/按指定的格式获取时间return str;Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) / TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (requestCode = 1) /图片Bitmap bitmap = BitmapFactory.decodeFile(phoneFile.getAbsolutePath();/获取路径c_img.setImageBitmap(bitmap);/展示内容if (requestCode = 2) /视频v_video.setVideoURI(Uri.fromFile(videoFile);/加载视频v_video.start();/播放视频MyAdapter.javapackage com.liwenhuan.notepad;public class MyAdapter extends BaseAdapter private Context context;private Cursor cursor;private LinearLayout layout;/视图对象/构造方法public MyAdapter(Context context, Cursor cursor) this.context = context;this.cursor = cursor;Overridepublic int getCount() return cursor.getCount();/返回长度Overridepublic Object getItem(int position) return cursor.getPosition();Overridepublic long getItemId(int position) / TODO Auto-generated method stubreturn position;public View getView(int position, View convertView, ViewGroup parent) LayoutInflater inflater = LayoutInflater.from(context);/加载试图的权限layout = (LinearLayout) inflater.inflate(R.layout.cell, null);/布局文件TextView contenttv = (TextView) layout.findViewById(R.id.list_content);/获取上条布局文件中的每一个内容TextView timetv = (TextView) layout.findViewById(R.id.list_time);/显示时间ImageView imgiv = (ImageView) layout.findViewById(R.id.list_img);/显示图片ImageView videoiv = (ImageView) layout.findViewById(R.id.list_video);/显示视频cursor.moveToPosition(position);/查询String content = cursor.getString(cursor.getColumnIndex(content);/承载查询到的具体内容String time = cursor.getString(cursor.getColumnIndex(time);/获取时间String url = cursor.getString(cursor.getColumnIndex(path);/获取图片的缩略图String urlvideo = 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);/在列表显示图片缩略图return layout;/获取图片的缩略图public Bitmap getImageThumbnail(String uri, int width, int height) Bitmap bitmap = null;BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;bitmap = BitmapFactory.decodeFile(uri, options);options.inJustDecodeBounds = false;int beWidth = options.outWidth / width;int beHeight = options.outHeight / height;int be = 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);return bitmap;/获取视频的缩略图private Bitmap getVideoThumbnail(String uri, int width, int height, i

温馨提示

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

评论

0/150

提交评论