完全开源Android项目:PDF电子书架软件——不动的大图书馆

不动的大图书馆

Author:雾雨霜星

Web:雾雨霜星 | DA☆ZE (shuangxing.top)

Time:2021-09-04

软件简介

"不动的大图书馆"是一款简单、高效、开源的PDF电子书书架软件。

特点:

  • 简单:简洁UI界面;无需用户登录;
  • 干净:不带有任何广告,不会插播任何等待打开页面
  • 安全:不提供联网接口,不会发送任何用户信息
  • 高效:功能清晰,记录每次最后阅读
  • 独立:不与任何第三方软件进行交互
  • 兼容:适用于任何Android版本的系统
  • 轻量:自身体积小,后期所占空间由添加的PDF文件决定
  • 开源:源码完全开放,可根据需求自定义

开源地址:不动的大图书馆: 不动的大图书馆(APP):一款简单、干净、高效、开源的PDF电子书架软件。 (gitee.com)

开源地址(github):pdf-library-app

下载APK:app-release.apk · 雾雨魔理沙/不动的大图书馆 - 码云 - 开源中国 (gitee.com)

下载APK:pdf-library-app-apk(github)

使用说明

主要有四个页面:主页面(书架与电子书)、搜索页面、阅读页面、目录页面

页面说明

主页面:

  • 工具栏左上角的加号按键:创建新书架
  • "最近阅读"书架:记录了上次阅读的PDF文件及其页码
  • 书架块靠左侧加号按键:对此书架添加PDF文件,进入搜索页面
  • 书架块靠右侧菜单按键:下拉展示此书架内的PDF文件
  • 长按书架块:对书架进行重命名或者删除操作
  • 长按电子书块:对相应书架文件夹下的PDF文件进行重命名或者删除操作
  • 点击电子书块:进入阅读页面,打开此PDF文件

搜索页面:

  • 返回书架按键:关闭搜索页面,返回主页面
  • 从手机中选择文件按键:从手机中选择PDF文件添加到相应的书架
  • 从文件夹搜索文件按键:从手机中选择文件夹,搜索此文件夹内的PDF文件,列出搜索结果,点击搜索结果决定是否选择添加

阅读页面:

  • 上一页按键:自动翻页到上一页
  • 目录按键:进入目录页面
  • 下一页按键:自动翻页到下一页

目录页面:

  • 左上角的返回按键:关闭目录页面,返回阅读页面
  • 目录项左侧的箭头按键:点击下拉展开该目录项的子目录
  • 点击目录项块:关闭目录页面并返回阅读页面,翻页到相应的页码

内部存储模式

  • APP安装后第一次启动,会在自己的目录路径下建立以下两个文件
    • library文件夹:其内为书架文件夹(每个书架对应一个文件夹),书架文件夹内为该书架所有的PDF文件
    • recentReadRecord.txt:用于记录最近阅读的文本文件(第一行为"最近阅读"书架的书架名;第二行为上次阅读的PDF文件位置;第三行为上次阅读到的页码)
  • 关于添加PDF文件:复制操作,而不是移动操作。即原位置的PDF文件不会改变,只是复制多了一份到相应的书架文件夹下。
  • 内部存储空间占用:软件自身大小约为20M左右,后期内部存储空间占用为所添加的PDF文件。考虑到某些PDF文件比较大(甚至可能大于25M),可考虑删除其原本所在位置下的PDF文件。

软件卸载

卸载软件时,其中的library文件夹和recentReadRecord.txt也会被一并删除。故已经复制到了书架文件夹中的PDF文件的复制文件也会被删除。

已知BUG

  1. 视图延迟:
  • 电子书执行重命名或者删除操作后,书架中PDF文件的顺序未变化,仅视图上变化了。要重新点击展开按键,来实现更改。
  • "最近阅读"软件后重开才生效,即不关闭软件,显示上不会改变。但记录文件在阅读页面退出时已更新。
  1. 视图缺失:

    对普通书架进行重命名或删除操作后,"最近阅读"书架会在界面消失。重新打开软件即可。

  2. 记录延迟:

    "最近阅读"中对应的PDF文件被删除后,记录未发生改变时,打开会直接显示空白。

  3. 记录缺失:

    "最近阅读"书架重命名后其内保存的记录会消失。

源码浅析

src/main/java/com.example.ebookapp/

  • MainActivity.java:主页面类
    1. 主页面挂载activity_main.xml,文件夹管理器(FileManager)、视图控制管理器(ViewManager)初始化
    2. 视图管理器控制显示书架、"最近阅读"书架
    3. 主页面的ToolBar初始化
  • CatalogueActivity.java:目录页面类,主要是控制显示目录列表,设置子目录显示的监听
  • PdfViewActivity.java:阅读页面类
    1. 获取上一个页面启动Intent传输过来的PDF文件位置、页码
    2. pdfView的设置:事件监听、渲染风格、文件确定
    3. 完全加载后获取目录树数据
    4. 设置目录页面的回调监听
  • SearchBookActivity.java:搜索页面类
    1. 初始化UriFileService
    2. 页面控件初始化,视图控制管理器监听控制页面变化
    3. 配置使用Intent获取URI进行文件访问的回调监听
  • Service/Manager/:
    • FileManager:文件管理类
      1. APP初始化检查Library文件夹、检查记录文本文件
      2. 读取最近阅读记录文本文件
      3. 读取书架文件夹
      4. 删除文件夹或者文件
    • ViewManager:视图控制管理类
      1. 书架显示
      2. 显示"最近阅读"书架
      3. 目录显示
      4. 显示搜索结果列表
    • PermissionManager:权限控制类。主要进行动态获取权限、检查权限状况。
  • Service/Service/:提供服务接口的类
    • UriFileService:提供使用Intent获取URI访问文件的服务
      1. 启动Intent获取打开文件、文件树的URI的页面
      2. 文件复制:提供文件URI与目录路径执行复制操作
      3. 获取文件树URI对应文件夹下所有的PDF文件的URI
  • Service/Listener/:
    • ListenerAddBook:添加PDF文件的按键的点击事件监听器
    • ListenerCatalogueGoBack:目录页面返回按键的点击事件监听器
    • ListenerCatalogueItemOnClick:目录页面目录项的点击事件监听器
    • ListenerCatalogueSubset:目录页面展示子目录按键的点击事件监听器
    • ListenerCreateShell:创建新书架按键的点击事件监听器
    • ListenerDisplayBook:下拉显示电子书按键的点击事件监听器
    • ListenerDisplayBookRecentRead:下拉"最近阅读"书架显示电子书按键的点击事件监听器
    • ListenerOpenCatalogue:阅读页面打开目录按键的点击事件监听器
    • ListenerRemoveRenameBook:电子书块的长按执行重命名或删除的事件监听器
    • ListenerRemoveRenameRecentRead:"最近阅读"书架长按执行重命名或删除的事件监听器
    • ListenerRenameRemoveShell:普通书架块的长按执行重命名或删除的事件监听器
    • ListenerSearchItemOnClick:搜索结果列表各项的点击事件监听器
    • ListenerToolbarOnClick:主页面的工具栏(ToolBar)点击事件监听器
  • Service/Adapter/:各个ListView的子元素数据接口Adapter
    • ListViewAdapter:用于显示:书架电子书、搜索项电子书的ListView的子元素数据接口
    • ListViewCatalogueSubsetAdapter:主要用于显示目录的子目录的ListView每一项的数据接口
  • widget/:JavaBean风格抽象类
    • Book:电子书抽象化
    • Shell:书架抽象化
    • MyListView:自定义ListView控件,解决ScrollView中只显示一项的问题
    • TreeNodeData:树形控件数据类(会用于页面间传输,所以需实现Serializable 或 Parcelable)

src/main/res/values/strings.xml

各处显示文本的资源文件,可在此处集中修改显示文本。

外部依赖

使用的外部依赖是:android-pdfview

开源地址:[GitHub - JoanZapata/android-pdfview: DEPRECATED] A fast PDF reader component for Android development

主要用于完成PDF文件的解码、渲染、载入工作。

UI资源

项目中所用的各种SVG图标的来源:iconfont-阿里巴巴矢量图标库

项目的APP图标来源:腾讯云某广告的中间截图所得的图案

其他

源码中已经做了详细注释。

具体技术实现可以从我的网站上的文章进行了解。

起源

大概就是没事找事然后就做了这么一件事。

之前获得了大量的PDF电子书文件,每次打开WPS来看首先就是广告,然后不小心点到哪里,又是弹出广告…服了=_=。

为了方便此后对PDF电子书和文献的阅读,顺路玩玩Android,于是不动的大图书馆就出现了。

欢迎任何BUG的反馈、新的需求的提出,可在评论区留言或者在我的网站留言。

欢迎对新主题的开发。

参考

Android官方文档:从共享存储空间访问文档和其他文件 | Android 开发者 | Android Developers (google.cn)

关于基本布局:Android——六大基本布局总结_编程小马-CSDN博客_android 布局

关于Android10/11的分区存储策略:Android Q & Android 11存储适配(一) 基础知识点梳理 - 掘金 (juejin.cn)

关于权限的管理:Android权限(Permissions)处理 - 简书 (jianshu.com)

关于PDF文件目录树的解析:Android原生PDF功能实现 - 齐行超 - 博客园 (cnblogs.com)

关于URI的使用:Android中的Uri详解_yy的博客-CSDN博客_android uri

关于URI的使用:Android 调用系统文件管理器在指定路径目录打开文件 - SegmentFault 思否

关于URI与文件管理器:Android文件管理器选择文件,获得文件路径URI转File - 简书 (jianshu.com)

关于Android的系统资源图标:Android系统资源图标android.R.drawable - 竹山一叶 - 博客园 (cnblogs.com)

鸣谢

自然是要感谢我自己。

推广一下:雾雨霜星 | DA☆ZE (shuangxing.top)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618230.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Epub电子书阅读软件-IOS软件开发团队

闲时做的Epub的阅读器,Ipad客户端的,现在只有本地一本书,具体功能包括:

Linux 基金会宣布正式进驻中国

在 LinuxCon 2017 (北京)即将召开前夕,我们Linux 中国会同 51CTO、开源中国对 Linux 基金会执行董事 Jim Zemlin 进行了一场远跨大洋的视频专访。 在这次专访中,Jim 先生回答了几个开源界和互联网领域关注的问题,并披…

webServer_国内手机号码归属地查询

网站&#xff1a;MObileCodeWS Web服务 wsimport生成Java语言的本地代理把远程的服务解析成本地的类和接口 wsimport命令 设置jdk\bin 环境变量 指定path 语法 wsimport [opationns] <wsdl_uri> - wsdl_uri:wsdl 的统一资源标识符 - d : 指定要输出的文…

大讲电话归属地查询

大家好&#xff0c;今天给大家发一大招&#xff0c;讲的是电话归属地查询&#xff0c;只要是有效的电话号码都可以查出是哪个地方&#xff0c;还可以查询长途号码的归属地&#xff0c;由于数据库不是很完整&#xff0c;那些短号码就不能查到&#xff0c;比如说110,10086,95588&…

如何使用免费手机号归属地查询API快速获取手机号归属地,两种方法【源码可用】

福利彩蛋&#xff1a;没有好玩的API接口&#xff1f;上百款免费接口等你来 一、通过手机号码归属地接口查询 根据手机号码(段)&#xff0c;查询手机号码归属地信息&#xff0c;如省份 、城市、运营商 简单快捷&#xff0c;根据个人需求进行开发 接口请求流程&#xff1a; 1、免…

图床项目进度(二)——动态酷炫首页

前言&#xff1a; 前面的文章我不是说我简单copy了站友的一个登录页吗&#xff0c;我感觉还是太单调了&#xff0c;想加一个好看的背景。 但是我前端的水平哪里够啊&#xff0c;于是在网上找了找制作动态背景的插件。 效果如下图。 如何使用 这个插件是particles.js 安装…

电话号码归属地查询

简单的电话号码归属地查询器 一、说明&#xff1a;仅供初学者借鉴&#xff0c;希望多多提意见&#xff0c;共同进步。 二、项目结构及界面图展示&#xff1a; 三、布局文件&#xff0c;较简单 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/an…

实现IP地址归属地显示功能、号码归属地查询

通过IP获取地址的原理 IP地址本身是不具备定位功能的&#xff0c;IP地址只是用来决定一台网络主机在网络里的相对位置&#xff0c;这个位置是相对而言&#xff0c;可以通过IP路由到目的主机&#xff0c;并不会关心目的主机的物理位置在哪里。所以理论上是不可能定位到IP地址的…

MySql015——使用子查询

一、创建customers表 ######################## # Create customers table ######################## use study;CREATE TABLE customers (cust_id int NOT NULL AUTO_INCREMENT,cust_name char(50) NOT NULL ,cust_address char(50) NULL ,cust_city char…

【原创】jmeter并发测试计划

bankQPS 创建线程组 设置并发参数 HTTP请求GET 添加HTTP请求 GET请求 查看结果树 HTTP请求 POST 添加HTTP请求 参数必须设置头信息格式&#xff1a; 添加HTTP头信息 查看结果树 可以选择&#xff0c;仅查看错误日志 汇总报告

rke安装k8s

1、修改集群中各物理机主机名hostname文件 # 查看 cat /etc/hostname # 命令修改 hostnamectl set-hostname k8s-master2、实现主机名与ip地址解析 # 查看cat /etc/hosts # 修改 vi /etc/hosts3、配置ip_forward过滤机制 # 修改 vi /etc/sysctl.conf net.ipv4.ip_forward1…

day 40 | 139. 单词拆分

139. 单词拆分 首先要明确这个是求排列数&#xff0c;所以是先遍历背包&#xff0c;再遍历物品。 func wordBreak(s string, wordDict []string) bool {dp : make([]bool, len(s) 1)dp[0] truefor j : 1; j < len(s); j{for i : 0; i < len(wordDict); i{if j - len…

windows7设置桌面

为什么80%的码农都做不了架构师&#xff1f;>>> win7设置桌面 1&#xff0c;桌面--右键--个性化 2&#xff0c;点击“联机获取更多主题” 或者直接打开微软的网站 https://support.microsoft.com/zh-cn/help/13768 3&#xff0c;下载 4&#xff0c;双击??.themep…

Windows7 3D桌面设置

1.winTab&#xff08;短暂&#xff09; 2.CtrlWinTab(3D桌面锁定) 3.快捷方式的 方法&#xff1a;桌面上新建一个快捷方式&#xff0c;在要求输入项目位置中输入&#xff1a;X:/Windows/system32/rundll32.exe DwmApi #105&#xff08;X为系统盘&#xff09;&#xff0c;下一…

如何识别PCI/PCIE设备需要申请多大的地址空间?

1、PCI/PCIE设备的配置空间 (1)PCI/PCIE设备需要的资源都在配置空间里进行指定&#xff0c;其中需要的地址空间资源在配置空间的基地址寄存器里指定&#xff1b; (2)参考博客&#xff1a;《PCI设备和PCI桥的配置空间(header_type0、header_type1)和配置命令(type0、type1)详解》…

4.21 用了 TCP 协议,数据一定不会丢吗?

目录 数据包的发送流程: 建立连接时丢包 流量控制丢包 网卡丢包 RingBuffer过小导致丢包 网卡性能不足 接收缓冲区丢包 两端之间的网络丢包 ping命令查看丢包&#xff1a; mtr命令&#xff1a; 发生丢包了怎么办 用了TCP协议就一定不会丢包吗​编辑 这类丢包问题怎…

c++中的基本类型

专栏简介&#xff1a;为什么我要重新介绍c的相关知识&#xff0c;在此之前&#xff0c;我对于c的了解也仅仅是在表面。而在后来与c慢慢的接触中&#xff0c;c编程语言越来越让我觉得深奥&#xff0c;所以还是想要重新开创一个专栏来介绍c。对于c的介绍&#xff0c;本专栏会先介…

DTC状态变化例子 4

例子1&#xff1a; 此示例概述了两个操作周期排放相关的 OBD DTC 中 DTC 状态位的操作。该图显示了两个操作周期排放相关的 OBD DTC 的处理。该处理也可应用于非排放相关的 OBD DTC&#xff0c;此处显示仅供一般参考。 0 接收到清除诊断信息 → DTC 状态字节初始化。 1, 2 相关…

CPU深度解析

操作系统课程 计算机组成 ALU:计算单元(运算器)PC:pc寄存器存执行指令Registers:寄存器存数据MMU:控制器程序的构成:指令+数据 总线:一个程序读入内存,全是由0和1构成,从内存读取到cpu计算,需要通过总线。一段01数据段是指令还是数据是通过来源总线区分的。总线分…

c语言练习题34:打印整数二进制的奇数位和偶数位

打印整数二进制的奇数位和偶数位 获取一个整数二进制序列中所有的偶数位和奇数位&#xff0c;分别打印出二进制序列 思路&#xff1a; 1. 提取所有的奇数位&#xff0c;如果该位是1&#xff0c;输出1&#xff0c;是0则输出0 2. 以同样的方式提取偶数位置检测num中某一位是0还…