基于Android的在线电子书阅读器报告.docx
- 文档编号:4573102
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:32
- 大小:154.01KB
基于Android的在线电子书阅读器报告.docx
《基于Android的在线电子书阅读器报告.docx》由会员分享,可在线阅读,更多相关《基于Android的在线电子书阅读器报告.docx(32页珍藏版)》请在冰豆网上搜索。
基于Android的在线电子书阅读器报告
期末作品报告
课程名称:
Android应用程序开发
学号:
姓名:
班别:
引言
在这个快节奏的时代,人们的空余时间越来越零碎,而且人们对智能手机的依赖越来越重,所以,一个拥有丰富功能且能随时进行电子书阅读的在线小说阅读器的出现,则是我们刻不容缓的事情。
此软件是在Android平台上进行设计开发,此软件的开发是通过了客户需求分析阶段以及技术可行性分析阶段,然后进行总体设计阶段和详细设计编码等阶段。
此软件不仅具有基本的电子书阅读功能,而且还拥有丰富的实用功能设计。
经过不断的测试与完善,电子书阅读器功能稳定,并且在真机上对其进行了测试与验证,基本上达到了用户的需求标准。
1、功能分析
1.1项目来源
此次开发的项目是在线小说阅读器,属于自选项目。
随着社会的发展,人们的生活节奏也越来越快空闲时间也越来越零碎,人们没有了大段的时间来进行书籍的阅读,所以一款能利用零碎时间进行随时阅读的软件成为了我们的需求。
而一款能在人们随身携带的手机上运行的阅读软件成为了大家的选择。
以前我们看看杂志,小说都要去图书馆借阅,而且时间有限,很不方便;而在电脑上看杂志,看小说,文档也是很不方便的。
以此看来,一个好的手机阅读器软件的开发是相当有必要的。
1.2开发目标
在线小说阅读器的开发目标就是让用户可以把零碎的空余时间有效的利用到书籍的阅读上,而且用户在没有网路的情况下也可以正常的进行书籍的阅读,让用户摆脱书籍的笨重携带不方便等确定,给予阅读者更大的便利性更好的舒适性。
此软件是在Android平台上进行设计开发,它的界面丰富简洁但是却不简单,它包含了书架界面、文件查看界面、软件设置界面、书籍阅读界面等界面,它的功能全面。
其优越性表现在:
自动扫描手机里的所有书籍、手动从文件夹中选择添加书籍、自动为书籍生成章节目录、添加查看书签、全文关键词搜索、阅读主题选择、阅读字体大小设置等功能。
此外,给用户更清晰方便的界面,也是本软件的出发点之一。
2、功能设计
2.1系统功能设计
根据需要,在线图书阅读器主要实现即时的在线阅读,主要包含以下功能:
(1)在线即时搜索图书:
可以按照书名、作者进行搜索所要阅读的书籍。
(2)在线即时阅读图书:
在线进行电子图书的全屏阅读。
(3)书签功能:
可以定制书签,以方便下次阅读。
(4)预读功能:
可以预读下一页的内容,减少用户等待的时间。
(5)选章阅读功能:
可以根据用户需要,有选择的进行阅读。
2.2软件的总体架构
在线小说阅读器采用PHP+Android+Sphinx的架构模式(如图1所示)。
用PHP做服务端,提供与阅读相关的一系列接口。
Android做客户端,与服务器端通信,完成用户的相关操作。
客户端与服务器端以SOAP作为基础通讯协议。
Sphinx作为搜索图书的引擎,提供强大的分词、查询等服务。
在线图书阅读器的系统架构:
在线小说阅读器软件主要分为8个功能大模块如图3所示,分别是欢迎模块、软件主界面、书籍管理、阅读管理、文件浏览、系统管理、使用帮助、关于。
其中书籍模块中还要文件扫描模块,阅读管理中有章节管理、书签管理、搜索管理。
系统设置中有密码设置。
其各个模块的详细设计如下:
1.软件欢迎模块。
该模块主要实现的功能是,通过Handler来实现一个2秒的缓冲界面,然后通过SharedPreferences读取配置文件,判断是否有密码。
如果有密码则跳转至密码验证界面;如果没有密码则判断是否为第一次使用此软件,如果是第一次使用则跳转至引导页面。
2.软件主界面模块。
该模块是一个通过TabHost标签组件来实现的一个分类管理功能。
本界面的标签在屏幕的最下方,分别是:
文件管理、我的书架、我的设置。
点击不同的标签则显示不同的界面,默认显示标签为“我的书架”,打开选项中会出现对应的视图。
实现了将本程序关联成手机默认打开程序中,即从外部打开文本文件时选择查看方式中会出现本软件图标供用户选择以本软件打开。
3.书籍管理。
该模块是以书架的模式来展现书籍,并可以对书籍进行一些操作,本模块共有3个书架分别为:
“最近阅读”、“历史阅读”、“收藏阅读”,默认显示是“最近阅读”书架。
本模块有导航按钮和书籍选择按钮。
当弹出导航栏时,则把书籍从每行显示三本书籍调整到每行显示两本书籍。
导航栏中与三大项:
分类排序、添加书籍、清空书籍。
每项里面又有子菜单。
当点击导航里的按钮时会显示子功能导航,当再点击其它按钮时,会收起前面的子功能导航,展开当前的子功能。
当单击书籍选择按钮时会弹出书籍选择窗口,选择里面的书架则进入相应的书架界面,同时还可以通过左右滑动来切换书架界面。
当单击书籍时会打开相应的书籍阅读界面,长按某书籍时会弹出书籍操作窗口。
4.文件浏览。
该模块使用ListView组件显示文件目录,不同的文件类型显示不同的图标。
最上面标题栏有导航按钮,当点击导航按钮时会从左侧弹出导航栏,导航栏中有标记文件按钮、分类排序按钮和添加到书架按钮,点击标记文件按钮或长按某文件或目录时则切换到多选模式,其中有多选按钮、反选按钮和取消按钮;点击分类排序则弹出子菜单,其中有按名称排序、按大小排序、按时间排序和按类型排序;点击添加到书架时如果为选择文件则自动进入多选模式让用户进行文件选择,如果用户未选择则提示“请选择书籍”,进行选择是用户可选择文件或目录,系统会自动进行扫描,把符合要求的文件添加到“最近书架”中,并弹出提示信息,其中有失败个数、已存在个数和成功个数。
在多选模式下点击返回按钮或点击标记文件会取消多选模式。
非多选模式下,用户点击文件时本软件会根据文件扩展名来判断打开文件方式,如果是文本文件则直接用本软件打开,并把其添加到“最近书架”中,其它格式则调用对应的软件打开,如果是未识别的类型则提示“没有打开此文件的应用”。
5.阅读管理。
该模块通过自定义一个View视图来显示书页,通过自定义类来读取文本内容并通过onDraw()方法把文件名、文本内容、电量信息、时间信息和已读百分比进行绘制成图片,并通过View来把绘制的图片显示出来。
第一次进入阅读页面是会有显示引导页面来指导用户如何读本页面进行操作。
本页面操作包括点击事件和滑动事件,点击左侧屏幕进行向上翻页,点击右侧屏幕进行向下翻页,点击屏幕中间画出菜单选项。
此菜单是使用PopupWindow组件实现,菜单分上下两部分,上面的菜单有返回按钮、屏幕亮度调节按钮和添加书签按钮;下面的菜单有主题选择按钮、搜索按钮、书签按钮、目录按钮、字体大小调节按钮、翻页方式按钮、夜间模式切换按钮和退出软件按钮。
6.系统设置。
系统设置模块包括阅读设置和系统设置。
阅读设置中有连续阅读模式、阅读完成时自动归类、阅读休息提醒和阅读空闲退出。
连续阅读模式:
下次启动直接进入上次阅读的界面进行继续阅读;阅读完成时自动归类:
当书籍阅读到最后一页后对此书籍自动移至“历史阅读”书架中;阅读休息提醒:
设置一个时间,当用户在阅读页面停留至这个时间时会弹出个提示框来提醒用户进行休息;阅读空闲退出:
设置一个时间,当用户停留在阅读界面并且为对其未进行任何操作至这个时间时,系统会自动关闭本软件。
系统设置中有显示隐藏文件、使用软件密码、退出确认、使用帮助和关于。
显示隐藏文件:
当用户选择此设置后会在下次启动本软件时在文件浏览中显示隐藏文件;使用软件密码:
用户可以对此软件进行密码设置;退出时确认:
当选择此设置后,退出软件时会显示一个确认框进行退出确认,未选择此设置时则会直接退出本软件;使用帮助:
显示本软件的帮助信息;关于:
显示关于本软件的信息。
本软件的设置信息全部使用SharedPreferences存储。
7.使用帮助。
该模块通过读取帮助文件在TextView中显示,并且为TextView添加滚动条。
文件中含有本软件的特点、功能介绍、操作说明等。
3、功能实现
一、客户端
1、HomeActivity.java代码:
packageactivity;
importinterfaces.IPushData;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.List;
importnetwork.ClientSocket;
importadapter.ListAdapter;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.AdapterView;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.ListView;
importcom.example.wysocket.R;
publicclassHomeActivityextendsActivityimplementsIPushData{
List
ListViewmListView;
ListAdapteradapter;
privateHandlermhandler=newHandler()
{
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
switch(msg.what){
case1:
adapter.notifyDataSetChanged();
break;
default:
break;
}
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onCreate(savedInstanceState);
setContentView(R.layout.home_activity);
initView();
requestServer();
}
privatevoidinitView()
{
mListView=(ListView)findViewById(R.id.list_home);
adapter=newListAdapter(directorys,this);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView
>parent,Viewview,
intposition,longid){
StringbookName=directorys.get(position);
Intentintent=newIntent(HomeActivity.this,ReaderActivity.class);
intent.putExtra("bookName",bookName);
startActivity(intent);
}
});
}
/**
*请求服务器获取目录
*/
privatevoidrequestServer()
{
ClientSocketclient=newClientSocket("getDiretory",this);
client.start();
}
@Override
publicvoidonError(Objectobject){
//TODOAuto-generatedmethodstub
Log.d("HomeActivity","链接服务器失败");
}
@Override
publicvoidonSuccess(Objectobject){
//TODOAuto-generatedmethodstub
Stringdata=(String)object;
List
if(temp!
=null)
{
directorys.clear();
for(inti=0;i { directorys.add(temp.get(i)); } } mhandler.sendEmptyMessage (1); } /** *将目录内容分离成适配器所需要的数据源 *@paramdata服务器返回的字符串 *@return适配器所需要的数据源 */ privateList { returnArrays.asList(data.split(";")); } } 2、ReaderActivity.java代码: packageactivity; importcom.example.wysocket.R; importinterfaces.IPushData; importnetwork.ClientSocket; importandroid.app.Activity; importandroid.os.Bundle; importandroid.os.Handler; importandroid.os.Message; importandroid.widget.TextView; publicclassReaderActivityextendsActivityimplementsIPushData{ StringbookName; StringcustormString="_wy";//用于服务器对请求参数的判断 StringbufString;//缓存的字符串 privateHandlermhandler=newHandler() { @Override publicvoidhandleMessage(Messagemsg){ super.handleMessage(msg); switch(msg.what){ case1: tvContent.setText(bufString); break; default: break; } } }; privateTextViewtvContent; @Override protectedvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); setContentView(R.layout.reader_activity); bookName=getIntent().getStringExtra("bookName"); bookName=bookName+custormString; initView(); reqeustServer(); } privatevoidinitView(){ //TODOAuto-generatedmethodstub tvContent=(TextView)findViewById(R.id.tv_content); } privatevoidreqeustServer() { ClientSocketsocket=newClientSocket(bookName,this); socket.start(); } /** *这里获取得到bufString为8k,在服务端自定义返回字节的大小, *根据自己的分页思路来做吧。 */ @Override publicvoidonSuccess(Objectobject){ //TODOAuto-generatedmethodstub bufString=(String)object; mhandler.sendEmptyMessage (1); } /** * */ @Override publicvoidonError(Objectobject){ //TODOAuto-generatedmethodstub } } 3、IPushData.java代码: packageinterfaces; /** *回调接口。 *@authorWy。 * */ publicinterfaceIPushData{ voidonSuccess(Objectobject); voidonError(Objectobject); } 4、ClientSocket.java代码: packagenetwork; importinterfaces.IPushData; importjava.io.IOException; import.Socket; import.UnknownHostException; importandroid.R.integer; importutil.FileUtils; /** *连接服务器的Socket,只是简单的根据不同的请求参数,获取不同的String。 *@authorWy。 * */ publicclassClientSocketextendsThread{ Socketsocket; finalstaticStringIP="192.168.31.29";//本机IP地址,使用模拟器就用10.0.2.2。 finalstaticintport=56565;//服务器的端口。 FileUtilsfileUtils;//操作Socket流。 StringrequestParam;//请求参数。 IPushDataiPushData;//回调接口。 publicClientSocket(StringrequestParams,IPushDatai){ this.requestParam=requestParams; iPushData=i; fileUtils=newFileUtils(); } @Override publicvoidrun(){ try{ Socketsocket=newSocket(IP,port); //先添加请求参数。 fileUtils.outPut(socket,requestParam); //获取服务器返回的字符串。 StringdataString=fileUtils.Input(socket); //关闭Socket的流。 fileUtils.closeSocket(); //回调。 iPushData.onSuccess(dataString); }catch(UnknownHostExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } 5、FileUtils.java代码: packageutil; importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.File; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; import.Socket; importjava.util.ArrayList; importjava.util.Arrays; importjava.util.List; /** *封装操纵Socket的输入输出流。 *@authorWy。 * */ publicclassFileUtils{ OutputStreamoutputStream=null; BufferedOutputStreambufferedOutputStream=null; InputStreamInputStream=null; BufferedInputStreambufferedInputStream=null; /** *链接的Socket,要发送的内容。 *@paramsocket *@paramcontent */ publicvoidoutPut(Socketsocket,Stringcontent) { try{ outputStream=socket.getOutputStream(); bufferedOutputStream=newBufferedOutputStream(outputStream); byte[]temp=content.getBytes("GB2312"); System.out.println(content); bufferedOutputStream.write(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Android 在线 电子书 阅读器 报告