安卓记事本开发报告

更新时间:2023-09-10 03:23:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于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,进入Help—>Install New Software—>Add,添加ADT插件。

(5)进入Window—>Android—>Browse,选择SDK安装目录。 3.2硬件环境

Android设备,如Android手机或平板电脑,主频在1Ghz及以上,内存为512MB以上,系统版本为Android2.1及以上。本设计使用Android4.4.4的手机。

3.3 软件环境

操作系统:windows10 IDE:Eclipse

Android 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文件夹是编译后的字节码存放的目录,编译的过程首先是编译成为android java虚拟机文件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(\ + TABLE_NAME + \ + ID + \ + CONTENT + \ + PATH + \

+ VIDEO+ \ + TIME + \NULL)\);

}

5.2 添加文字内容

当以文本方式记事时,需要对输入的文字内容进行保存。

public void initView() {

if (val.equals(\)) { // 文字

c_img.setVisibility(View.GONE);//隐藏

v_video.setVisibility(View.GONE);//隐藏 } }

public void onClick(View v) { switch (v.getId()) { case R.id.save:

addDB();//添加数据

finish();//关闭当前Activity break;

}

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; }

@Override

public int getCount() {

return cursor.getCount();//返回长度 } @Override public Object getItem(int position) { return cursor.getPosition(); } @Override public 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(\));//获取具体内容 String time = cursor.getString(cursor.getColumnIndex(\));//获取时间 String url =

cursor.getString(cursor.getColumnIndex(\));//获取图片的缩略图 String urlvideo =

cursor.getString(cursor.getColumnIndex(\));//获取视频

contenttv.setText(content);//将内容传递进来

timetv.setText(time);//将时间传递进来

videoiv.setImageBitmap(getVideoThumbnail(urlvideo, 200, MediaStore.Images.Thumbnails.MICRO_KIND));//在列表显示视频imgiv.setImageBitmap(getImageThumbnail(url, 200, 200));//

200,

缩略图

在列表显示图片缩略图 return layout;

}

5.4添加图片和视频

在本设计中,不仅提供了以文本方式进行记事,还提供了以图片和视频

方式进行记事。

public void initView() {

if (val.equals(\)) {//图片

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() + \);//获取SD卡绝对路径 iimg.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(phoneFile));//存储获取的图片信息

startActivityForResult(iimg, 1);//启动跳转 }

if (val.equals(\)) {

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() + \);//获取SD卡绝对路径 video.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(videoFile));//存储获取的video信息 }

//显示图片或视频

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

}

startActivityForResult(video, 2);//启动跳转

}

// TODO Auto-generated method stub

super.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) {

0));

// TODO Auto-generated method stub super.onCreate(savedInstanceState);

setContentView(R.layout.select);//加载详情

// System.out.println(getIntent().getIntExtra(NotesDB.ID, 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(\)) { s_img.setVisibility(View.GONE); } else { s_img.setVisibility(View.VISIBLE); } if

(getIntent().getStringExtra(NotesDB.VIDEO).equals(\)) { 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.4

图6.3

6.2 真机测试

将记事本的apk文件导进手机,安装后进行测试,测试结果如下:

(1)添加好内容后,记事本的记事列表显示如图6.5所示。 (2)以文本方式添加记事,详情显示如图6.6所示。

图6.5

图6.6

(3)以图文方式添加记事,内容详情页显示如图6.7。 (4)以视频结合文字方式添加记事,内容详情页显示如图6.8。

图6.7

图6.8

7.总结

通过此次设计过程我会到了许多知识,在这个过程中遇到了许多困难,比如SDK和ADT的版本不能兼容,记事本项目可以在虚拟设备中运行,在真机上测试时却出现了问题,不能读取图片和视频,通过在网上查找资料,发现是虽然在代码中对SD卡添加了读取权限,但没有在AndroidMainfest.xml中添加对手机SD卡的读取权限,所以出现了如上的错误。通过不断的发现问题,总结问题和解决问题的过程,使我对Android的认识不断的提高,得到了宝贵的经验。

代码:

MainActivity.java

package com.liwenhuan.notepad;

//采用接口方式

public class MainActivity extends Activity implements OnClickListener {

private Button textbtn, imgbtn, videobtn;//声明三个button private ListView lv; //创建listview private Intent i;//通过intent来创建标识 private MyAdapter adapter;

private NotesDB notesDB;//数据库对象

private SQLiteDatabase dbReader;//获取读取权限 private Cursor cursor; @Override

protected void onCreate(Bundle savedInstanceState) { } //初始化

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);//数据库实例化 super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView();//调用初始化方法

dbReader = notesDB.getReadableDatabase();//获取读取权限 //获取记事详情

lv.setOnItemClickListener(new OnItemClickListener() {

@Override

public 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)));//获取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)));//获取视频 }

//添加一个复写方法 @Override

public void onClick(View v) {

i = new Intent(this, AddContent.class);//实例化操作 switch (v.getId()) { case R.id.text:

i.putExtra(\

startActivity(i);//跳转至AddContent.java

});

}

startActivity(i);//跳转到详情页

}

}

break;

case R.id.img:

i.putExtra(\startActivity(i); break;

case R.id.video: }

i.putExtra(\startActivity(i); break;

public void selectDB() { } @Override

protected void onResume() { }

super.onResume(); selectDB();

cursor = dbReader.query(NotesDB.TABLE_NAME, null, null, null, null,

null, null);

adapter = new MyAdapter(this, cursor); lv.setAdapter(adapter);

NotesDB.java

package com.liwenhuan.notepad;

public class NotesDB extends SQLiteOpenHelper {

public static final String TABLE_NAME = \指定名称 public static final String CONTENT = \内容 public static final String PATH = \图片

public static final String VIDEO = \视频 public static final String ID = \创建id

public static final String TIME = \当前保存文本的时间 //复写一个构造方法

public NotesDB(Context context) { } @Override //创建数据库

public void onCreate(SQLiteDatabase db) {

//创建

db.execSQL(\

+ \

super(context, \null, 1);//super返回值(context,库名,null,版本号)

CONTENT VIDEO }

}

+ \

+ \

@Override

//更新数据库,当前需求,不需要更新

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }

AddContent.java

package 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; @Override

protected void onCreate(Bundle savedInstanceState) { }

//判断是否显示 public void initView() {

if (val.equals(\文字 }

if (val.equals(\图片

c_img.setVisibility(View.GONE);//隐藏 v_video.setVisibility(View.GONE);//隐藏

super.onCreate(savedInstanceState);

setContentView(R.layout.addcontent);//绑定视图 val = getIntent().getStringExtra(\接收完成 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 = new NotesDB(this);//实例化 dbWriter = notesDB.getWritableDatabase(); initView();

c_img.setVisibility(View.VISIBLE);//显示 v_video.setVisibility(View.GONE);//隐藏

Intent iimg = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//

跳转到系统相机

phoneFile = new File(Environment.getExternalStorageDirectory()

.getAbsoluteFile() + \获取SD卡绝对路径,照片储存在SD卡中,数据库中只存储路径

iimg.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(phoneFile));//存储获取的图片信息

}

if (val.equals(\

c_img.setVisibility(View.GONE);//隐藏 v_video.setVisibility(View.VISIBLE);//显示

Intent video = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);//startActivityForResult(iimg, 1);//启动跳转

跳转到手机系统信息

videoFile = new File(Environment.getExternalStorageDirectory()

.getAbsoluteFile() + \获取

SD卡绝对路径

video.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(videoFile));//存储获取的video信息

} @Override

public void onClick(View v) {

switch (v.getId()) { case R.id.save:

addDB();//添加数据 finish();//关闭当前Activity break;

}

startActivityForResult(video, 2);//启动跳转

}

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(\年MM月dd日

HH:mm:ss\

}

Date curDate = new Date();

String str = format.format(curDate);//按指定的格式获取时间 return str;

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.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.java

package com.liwenhuan.notepad;

public class MyAdapter extends BaseAdapter {

private Context context; private Cursor cursor;

private LinearLayout layout;//视图对象 //构造方法

public MyAdapter(Context context, Cursor cursor) { } @Override

public int getCount() { } @Override

public Object getItem(int position) { } @Override

return cursor.getPosition(); return cursor.getCount();//返回长度 this.context = context; this.cursor = cursor;

public long getItemId(int position) { }

public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater inflater = LayoutInflater.from(context);//加载试图的权限 layout = (LinearLayout) inflater.inflate(R.layout.cell, null);//布局文件 // TODO Auto-generated method stub return position;

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(\承载查询到的具体内容 图

String time = cursor.getString(cursor.getColumnIndex(\获取时间 String url = cursor.getString(cursor.getColumnIndex(\获取图片的缩略

String urlvideo = cursor.getString(cursor.getColumnIndex(\获取视频 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) { }

//获取视频的缩略图

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, 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) { } else { }

if (be <= 0) { }

options.inSampleSize = be;

bitmap = BitmapFactory.decodeFile(uri, options);

bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,

ThumbnailUtils.OPTIONS_RECYCLE_INPUT);

be = 1; be = beHeight; be = beWidth;

return bitmap;

}

}

ThumbnailUtils.OPTIONS_RECYCLE_INPUT);

return bitmap;

SelectAct.java

package com.liwenhuan.notepad;

public class SelectAct extends Activity implements OnClickListener {

private Button s_delete, s_back; private ImageView s_img; private VideoView s_video; private TextView s_tv; private NotesDB notesDB;

private SQLiteDatabase dbWriter;//获取写权限 @Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.select);//加载详情 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(\

} else { }

s_img.setVisibility(View.GONE);

s_img.setVisibility(View.VISIBLE);

if (getIntent().getStringExtra(NotesDB.VIDEO).equals(\ } else { }

s_tv.setText(getIntent().getStringExtra(NotesDB.CONTENT));//加载TextView

s_video.setVisibility(View.VISIBLE); s_video.setVisibility(View.GONE);

的文字信息

}

Bitmap bitmap = BitmapFactory.decodeFile(getIntent().getStringExtra(

NotesDB.PATH));//加载图片信息

s_img.setImageBitmap(bitmap);//显示图片信息 s_video.setVideoURI(Uri

.parse(getIntent().getStringExtra(NotesDB.VIDEO)));

s_video.start();//播放视频

@Override

public void onClick(View v) {

switch (v.getId()) { case R.id.s_delete:

deleteDate();//删除

finish();//删除后页面不存在,直接关闭 break;

case R.id.s_back: }

finish(); break;

}

}

//删除记事

public void deleteDate() { }

dbWriter.delete(NotesDB.TABLE_NAME,

\

本文来源:https://www.bwwdw.com/article/5blh.html

Top