




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上期末作品报告 课程名称: Android应用程序开发 学 号: 姓 名: 班 别: 专心-专注-专业引言在这个快节奏的时代,人们的空余时间越来越零碎,而且人们对智能手机的依赖越来越重,所以,一个拥有丰富功能且能随时进行电子书阅读的在线小说阅读器的出现,则是我们刻不容缓的事情。此软件是在Android平台上进行设计开发,此软件的开发是通过了客户需求分析阶段以及技术可行性分析阶段,然后进行总体设计阶段和详细设计编码等阶段。此软件不仅具有基本的电子书阅读功能,而且还拥有丰富的实用功能设计。经过不断的测试与完善,电子书阅读器功能稳定,并且在真机上对其进行了测试与验证,基本上达
2、到了用户的需求标准。1、功能分析1.1项目来源此次开发的项目是在线小说阅读器,属于自选项目。随着社会的发展,人们的生活节奏也越来越快空闲时间也越来越零碎,人们没有了大段的时间来进行书籍的阅读,所以一款能利用零碎时间进行随时阅读的软件成为了我们的需求。而一款能在人们随身携带的手机上运行的阅读软件成为了大家的选择。以前我们看看杂志,小说都要去图书馆借阅,而且时间有限,很不方便;而在电脑上看杂志,看小说,文档也是很不方便的。以此看来,一个好的手机阅读器软件的开发是相当有必要的。1.2开发目标在线小说阅读器的开发目标就是让用户可以把零碎的空余时间有效的利用到书籍的阅读上,而且用户在没有网路的情况下也可
3、以正常的进行书籍的阅读,让用户摆脱书籍的笨重携带不方便等确定,给予阅读者更大的便利性更好的舒适性。此软件是在Android平台上进行设计开发,它的界面丰富简洁但是却不简单,它包含了书架界面、文件查看界面、软件设置界面、书籍阅读界面等界面,它的功能全面。其优越性表现在:自动扫描手机里的所有书籍、手动从文件夹中选择添加书籍、自动为书籍生成章节目录、添加查看书签、全文关键词搜索、阅读主题选择、阅读字体大小设置等功能。此外,给用户更清晰方便的界面,也是本软件的出发点之一。2、功能设计2.1系统功能设计 根据需要,在线图书阅读器主要实现即时的在线阅读,主要包含以下功能: (1)在线即时搜索图书:可以按照
4、书名、作者进行搜索所要阅读的书籍。(2)在线即时阅读图书:在线进行电子图书的全屏阅读。(3)书签功能:可以定制书签,以方便下次阅读。 (4)预读功能:可以预读下一页的内容,减少用户等待的时间。(5)选章阅读功能:可以根据用户需要,有选择的进行阅读。 22软件的总体架构 在线小说阅读器采用PHP+Android+Sphinx的架构模式(如图1所示)。用PHP做服务端,提供与阅读相关的一系列接口。Android做客户端,与服务器端通信,完成用户的相关操作。客户端与服务器端以 SOAP作为基础通讯协议。Sphinx作为搜索图书的引擎,提供强大的分词、查询等服务。在线图书阅读器的系统架构:在线小说阅读
5、器软件主要分为8个功能大模块如图3所示,分别是欢迎模块、软件主界面、书籍管理、阅读管理、文件浏览、系统管理、使用帮助、关于。其中书籍模块中还要文件扫描模块,阅读管理中有章节管理、书签管理、搜索管理。系统设置中有密码设置。其各个模块的详细设计如下:1.软件欢迎模块。该模块主要实现的功能是,通过Handler来实现一个2秒的缓冲界面,然后通过SharedPreferences读取配置文件,判断是否有密码。如果有密码则跳转至密码验证界面;如果没有密码则判断是否为第一次使用此软件,如果是第一次使用则跳转至引导页面。2.软件主界面模块。该模块是一个通过TabHost标签组件来实现的一个分类管理功能。本界
6、面的标签在屏幕的最下方,分别是:文件管理、我的书架、我的设置。点击不同的标签则显示不同的界面,默认显示标签为“我的书架”,打开选项中会出现对应的视图。实现了将本程序关联成手机默认打开程序中,即从外部打开文本文件时选择查看方式中会出现本软件图标供用户选择以本软件打开。3.书籍管理。该模块是以书架的模式来展现书籍,并可以对书籍进行一些操作,本模块共有3个书架分别为:“最近阅读”、“历史阅读”、“收藏阅读”,默认显示是“最近阅读”书架。本模块有导航按钮和书籍选择按钮。当弹出导航栏时,则把书籍从每行显示三本书籍调整到每行显示两本书籍。导航栏中与三大项:分类排序、添加书籍、清空书籍。每项里面又有子菜单。
7、当点击导航里的按钮时会显示子功能导航,当再点击其它按钮时,会收起前面的子功能导航,展开当前的子功能。当单击书籍选择按钮时会弹出书籍选择窗口,选择里面的书架则进入相应的书架界面,同时还可以通过左右滑动来切换书架界面。当单击书籍时会打开相应的书籍阅读界面,长按某书籍时会弹出书籍操作窗口。4.文件浏览。该模块使用ListView组件显示文件目录,不同的文件类型显示不同的图标。最上面标题栏有导航按钮,当点击导航按钮时会从左侧弹出导航栏,导航栏中有标记文件按钮、分类排序按钮和添加到书架按钮,点击标记文件按钮或长按某文件或目录时则切换到多选模式,其中有多选按钮、反选按钮和取消按钮;点击分类排序则弹出子菜单
8、,其中有按名称排序、按大小排序、按时间排序和按类型排序;点击添加到书架时如果为选择文件则自动进入多选模式让用户进行文件选择,如果用户未选择则提示“请选择书籍”,进行选择是用户可选择文件或目录,系统会自动进行扫描,把符合要求的文件添加到“最近书架”中,并弹出提示信息,其中有失败个数、已存在个数和成功个数。在多选模式下点击返回按钮或点击标记文件会取消多选模式。非多选模式下,用户点击文件时本软件会根据文件扩展名来判断打开文件方式,如果是文本文件则直接用本软件打开,并把其添加到“最近书架”中,其它格式则调用对应的软件打开,如果是未识别的类型则提示“没有打开此文件的应用”。5.阅读管理。该模块通过自定义
9、一个View视图来显示书页,通过自定义类来读取文本内容并通过onDraw()方法把文件名、文本内容、电量信息、时间信息和已读百分比进行绘制成图片,并通过View来把绘制的图片显示出来。第一次进入阅读页面是会有显示引导页面来指导用户如何读本页面进行操作。本页面操作包括点击事件和滑动事件,点击左侧屏幕进行向上翻页,点击右侧屏幕进行向下翻页,点击屏幕中间画出菜单选项。此菜单是使用PopupWindow组件实现,菜单分上下两部分,上面的菜单有返回按钮、屏幕亮度调节按钮和添加书签按钮;下面的菜单有主题选择按钮、搜索按钮、书签按钮、目录按钮、字体大小调节按钮、翻页方式按钮、夜间模式切换按钮和退出软件按钮。
10、6.系统设置。系统设置模块包括阅读设置和系统设置。阅读设置中有连续阅读模式、阅读完成时自动归类、阅读休息提醒和阅读空闲退出。连续阅读模式:下次启动直接进入上次阅读的界面进行继续阅读;阅读完成时自动归类:当书籍阅读到最后一页后对此书籍自动移至“历史阅读”书架中;阅读休息提醒:设置一个时间,当用户在阅读页面停留至这个时间时会弹出个提示框来提醒用户进行休息;阅读空闲退出:设置一个时间,当用户停留在阅读界面并且为对其未进行任何操作至这个时间时,系统会自动关闭本软件。系统设置中有显示隐藏文件、使用软件密码、退出确认、使用帮助和关于。显示隐藏文件:当用户选择此设置后会在下次启动本软件时在文件浏览中显示隐藏
11、文件;使用软件密码:用户可以对此软件进行密码设置;退出时确认:当选择此设置后,退出软件时会显示一个确认框进行退出确认,未选择此设置时则会直接退出本软件;使用帮助:显示本软件的帮助信息;关于:显示关于本软件的信息。本软件的设置信息全部使用SharedPreferences存储。7.使用帮助。该模块通过读取帮助文件在TextView中显示,并且为TextView添加滚动条。文件中含有本软件的特点、功能介绍、操作说明等。3、功能实现一、客户端1、 HomeActivity.java代码:package activity;import interfaces.IPushData;import java.
12、util.ArrayList;import java.util.Arrays;import java.util.List;import network.ClientSocket;import adapter.ListAdapter;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;
13、import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import com.example.wysocket.R;public class HomeActivity extends Activity implements IPushDataList<String> directorys =new ArrayList<String>();ListView mListView;ListAdap
14、ter adapter;private Handler mhandler = new Handler() Overridepublic void handleMessage(Message msg) super.handleMessage(msg); switch (msg.what) case 1:adapter.notifyDataSetChanged();break;default:break;Overrideprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.
15、onCreate(savedInstanceState);setContentView(R.layout.home_activity);initView();requestServer();private void initView()mListView=(ListView) findViewById(R.id.list_home);adapter =new ListAdapter(directorys, this);mListView.setAdapter(adapter);mListView.setOnItemClickListener(new OnItemClickListener()
16、Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) String bookName=directorys.get(position);Intent intent =new Intent(HomeActivity.this,ReaderActivity.class);intent.putExtra("bookName", bookName);startActivity(intent););/* * 请求服务器获取目录 */private vo
17、id requestServer()ClientSocket client =new ClientSocket("getDiretory",this);client.start();Overridepublic void onError(Object object) / TODO Auto-generated method stubLog.d("HomeActivity", "链接服务器失败");Overridepublic void onSuccess(Object object) / TODO Auto-generated met
18、hod stubString data=(String) object;List<String> temp =splitString(data);if(temp!=null)directorys.clear();for(int i=0;i<temp.size();i+)directorys.add(temp.get(i);mhandler.sendEmptyMessage(1);/* * 将目录内容分离成适配器所需要的数据源 * param data 服务器返回的字符串 * return 适配器所需要的数据源 */private List<String> spli
19、tString(String data)return Arrays.asList(data.split("");2、 ReaderActivity.java代码:package activity;import com.example.wysocket.R;import interfaces.IPushData;import network.ClientSocket;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;i
20、mport android.widget.TextView;public class ReaderActivity extends Activity implements IPushDataString bookName;String custormString ="_wy"/用于服务器对请求参数的判断String bufString ;/缓存的字符串private Handler mhandler = new Handler() Overridepublic void handleMessage(Message msg) super.handleMessage(msg);
21、 switch (msg.what) case 1:tvContent.setText(bufString);break;default:break;private TextView tvContent;Overrideprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.reader_activity);bookName=getIntent().getString
22、Extra("bookName");bookName=bookName+custormString;initView();reqeustServer();private void initView() / TODO Auto-generated method stubtvContent=(TextView) findViewById(R.id.tv_content);private void reqeustServer()ClientSocket socket =new ClientSocket(bookName, this);socket.start();/* * 这里获
23、取得到bufString为8k,在服务端自定义返回字节的大小, * 根据自己的分页思路来做吧。 */Overridepublic void onSuccess(Object object) / TODO Auto-generated method stubbufString=(String) object;mhandler.sendEmptyMessage(1);/* * */Overridepublic void onError(Object object) / TODO Auto-generated method stub3、IPushData.java代码:package interfa
24、ces;/* * 回调接口。 * author Wy。 * */public interface IPushData void onSuccess(Object object);void onError(Object object);4、 ClientSocket.java代码:package network;import interfaces.IPushData;import java.io.IOException;import .Socket;import .UnknownHostException;import android.R.integer;import util.FileUtil
25、s;/* * 连接服务器的Socket,只是简单的根据不同的请求参数,获取不同的String。 * author Wy。 * */public class ClientSocket extends Thread Socket socket;final static String IP="9" /本机IP地址,使用模拟器就用。final static int port =56565; /服务器的端口。FileUtils fileUtils; /操作Socket流。String requestParam; /请求参数。IPushData
26、iPushData; /回调接口。public ClientSocket(String requestParams,IPushData i) this.requestParam=requestParams;iPushData=i;fileUtils=new FileUtils();Overridepublic void run() try Socket socket =new Socket(IP,port);/先添加请求参数。fileUtils.outPut(socket, requestParam);/获取服务器返回的字符串。String dataString=fileUtils.Input
27、(socket);/关闭Socket的流。fileUtils.closeSocket();/回调。iPushData.onSuccess(dataString); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();5、FileUtils.java代码:package util;import java.io.BufferedInp
28、utStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .Socket;import java.util.ArrayList;import java.util.Arrays;import java.util.List;/* * 封装操纵Socket的输入输出流。 * author Wy。 * */public class FileUtils Ou
29、tputStream outputStream=null;BufferedOutputStream bufferedOutputStream=null;InputStream InputStream=null;BufferedInputStream bufferedInputStream=null;/* * 链接的Socket,要发送的内容。 * param socket * param content */public void outPut(Socket socket,String content)try outputStream = socket.getOutputStream();bu
30、fferedOutputStream=new BufferedOutputStream(outputStream);byte temp =content.getBytes("GB2312");System.out.println(content);bufferedOutputStream.write(temp);bufferedOutputStream.flush();/记得刷新,不然写不了内容的。 catch (IOException e) / TODO Auto-generated catch blockSystem.out.println(e.getMessage()
31、;/* * 当客户端读写完毕的时候,调用关闭流。 */public void closeSocket()try if(InputStream!=null)InputStream.close();if(bufferedInputStream!=null)bufferedInputStream.close();if(outputStream!=null)outputStream.close();if(bufferedOutputStream!=null)bufferedOutputStream.close(); catch (Exception e2) System.out.println(e2.
32、getMessage();/* * 获取该Socket链接对象,发送过来的内容。 * param socket * return */public String Input(Socket socket)try InputStream = socket.getInputStream();bufferedInputStream=new BufferedInputStream(InputStream);/8k的缓存byte data =new byte1024*8;int len=bufferedInputStream.read(data);String temp=new String(data,0
33、,len,"GB2312");return temp; catch (IOException e) / TODO Auto-generated catch blockSystem.out.println(e.getMessage();return "读取错误"二、服务器端1、CutContentThread.java代码:package servers;import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import .Soc
34、ket;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import util.BufferedRandomAccessFile;import util.FileUtils;/* * 截取文件内容并发送给客户端 * author Wy * */public class CutContentThread extends ThreadSocket socket=null;String bookPath;long pos=0;/文件指针BufferedRandomAccessFile reader;Fi
35、leUtils fileUtils ;public CutContentThread(Socket socket,String bookPath,long pos) this.socket=socket;this.bookPath=bookPath;this.pos=pos;fileUtils=new FileUtils(); File file =new File(bookPath); try reader =new BufferedRandomAccessFile(file,"r"); catch (IOException e) / TODO Auto-generate
36、d catch blockSystem.out.println(e.getMessage();Overridepublic void run() String content=sendChapter();fileUtils.outPut(socket, content);private String sendChapter() long currentIndex =pos;/文件指针,操纵文件指针来读取文件try reader.seek(currentIndex);/一次读8k,根据分页思路自定义大小byte buf = new byte1024*8; int len = 0; len = r
37、eader.read(buf,0,buf.length) ; String contentString=new String(buf, 0, len,"gbk"); System.out.println(contentString); return contentString; catch (IOException e) / TODO Auto-generated catch blockSystem.out.println(e.getMessage();return "" 2、DirectoryThread.java代码:package servers;
38、import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import .Socket;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import util.FileUtils;/* * 发送目录的线程 * * author Wy * */public class DirectoryThread extends Thread FileUtils fileUtils = nu
39、ll;Socket socket = null;String directory; / 文件目录public DirectoryThread(Socket socket, String directoryPath) this.socket = socket;fileUtils = new FileUtils();directory = directoryPath;/* * 获取文件名 */Overridepublic void run() String data=getFileName(".txt");fileUtils.outPut(socket, data);/* *
40、获取文件目录下的文件名 * * param filePath * return */private List<String> getDiretory(String filePath) List<String> files = new ArrayList<>();File file = new File(filePath);if (file.isDirectory() files = Arrays.asList(file.list();return files;/* * 获取不带后缀的文件,只匹配相应的后缀名 * param houzhui 后缀名,如&quo
41、t;.txt" * return 字符串 "西游记;红楼梦;" */private String getFileName(String houzhui) List<String> files = new ArrayList<>();files = getDiretory(directory);StringBuffer stringBuffer = new StringBuffer();for (String s : files) String temp = s.substring(s.length() - 4, s.length();if
42、(temp.equals(houzhui) stringBuffer.append(s.substring(0, s.length() - 4) + "");String temp = stringBuffer.toString();return temp;3、ConnectServer.java代码:package socketserver;import java.io.IOException;import .ServerSocket;import .Socket;import .SocketException;import java.util.ArrayList;imp
43、ort servers.CutContentThread;import servers.DirectoryThread;import util.FileUtils;public class ConnectServer extends Threadstatic final String reader="_wy"static long pos=0;/文件指针/public FileUtils fileUtils=null;/ServerSocket serverSocket=null;/public ConnectServer() public static void main
44、(String args) throws IOException System.out.println(".服务器已经启动.正在监听客户端信息");ServerSocket serverSocket =new ServerSocket(56565);/FileUtilsfileUtils=new FileUtils();while(true)try /监听,阻塞主线程Socket socket=serverSocket.accept();System.out.println("客户端IP ->"+socket.getInetAddress().ge
45、tHostAddress();/判断根据上传的内容,知道Sokect需要做什么chooseThread(socket);/chooseThread(socket); catch (IOException e) / TODO Auto-generated catch blockSystem.out.println(e.getMessage();private static void chooseThread(Socket socket)String bookName=""String updateString=""FileUtils fileUtils=n
46、ew FileUtils();updateString=fileUtils.Input(socket);System.out.println("updateString ->"+updateString);if(updateString.substring(updateString.length()-3,updateString.length().equals(reader)bookName=updateString.substring(0,updateString.length()-3)+".txt"updateString="getB
47、ookContent"switch (updateString) case "getDiretory":DirectoryThread thread= new DirectoryThread(socket, "E:/book");thread.start();break;case "getBookContent":String bookPath="E:/book/"+bookName;CutContentThread cutContentThread =new CutContentThread(socke
48、t, bookPath, 0);cutContentThread.start();break;default:fileUtils.outPut(socket, "请求参数不对");break;4、Client.java代码:package util;import java.io.IOException;import .Socket;import java.util.Arrays;import java.util.List;/* * 客户端测试类 * author Administrator * */public class Client private static Lis
49、t<String> splitString(String data)return Arrays.asList(data.split("");public static void main(String args) try /测试获取文件目录Socket socket =new Socket("", 56565);FileUtils fileUtils=new FileUtils();fileUtils.outPut(socket, "getDiretory");List<String> tem
50、p =splitString(fileUtils.Input(socket);System.out.println(temp.toString();fileUtils.closeSocket();/测试获取文件目录下的书Socket socket2 =new Socket("", 56565);fileUtils.outPut(socket2,(temp.get(6)+"_wy");System.out.println(fileUtils.Input(socket2); catch (IOException e) / TODO Auto-generated catch blockSystem.out.println(e.getMessage();5、FileUtils.java代码:package util;import java.i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 施工现场安全试题及答案
- 文言字词测试题及答案
- 汽修类单招试题及答案
- 信号与系统试题及答案
- 电缆证考试题及答案
- 2024年纺织品设计师证书的应试方法试题及答案
- 国际美术设计师考试中的备考方法与技巧试题及答案
- 督灸相关试题及答案详解
- 助理广告师广告设计原则试题及答案
- 2024年美术设计创新实践试题及答案
- DB12-T1196-2023公路养护工程质量检验评定标准
- 水幕电影制作合同
- 交通政策对经济增长的效应分析-深度研究
- 儿科感染性疾病
- 公司科学管理
- 学校社团的国际化交流与合作机会
- 2025年贵州教育出版社有限公司招聘笔试参考题库含答案解析
- 食品安全操作流程
- 呆滞品解决方案
- 2023年五家渠选聘专职人民调解员笔试真题
- 关于纳粹德国元首希特勒的历史资料课件
评论
0/150
提交评论