基于Android的在線電子書閱讀器報告_第1頁
基于Android的在線電子書閱讀器報告_第2頁
基于Android的在線電子書閱讀器報告_第3頁
基于Android的在線電子書閱讀器報告_第4頁
基于Android的在線電子書閱讀器報告_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論