如何在原生 Android 应用程序中渲染 epub 文件?

2024-02-05

我正在尝试制作一个 Android 应用程序,它将呈现 .epub 文件并在 Android 布局中显示其内容。

我做了一个类似的应用程序,使用 pdfRenderer 显示 pdf,它使用位图显示 pdf 页面。

如何在 android 中使用 epub 文件实现类似的效果? 我在用Epublib https://github.com/psiegman/epublib但我找不到任何好的教程。我也尝试过 skyepub 但它似乎已经过时了。

任何人都可以帮我举一个 epublib 的示例,这是我的 epublib 代码:

package org.inevitablesol.com.epubdemo;

import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import nl.siegmann.epublib.domain.Book;
import nl.siegmann.epublib.domain.TOCReference;
import nl.siegmann.epublib.epub.EpubReader;

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btn_openepub = (Button) findViewById(R.id.btn_openepub);
    btn_openepub.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        OpenEpubfile();
      }
    });

  }

  private void OpenEpubfile() {
    AssetManager assetManager = getAssets();

    try {
      // find InputStream for book
      InputStream epubInputStream = assetManager.open("books/The-Problems-of-Philosophy-LewisTheme.epub");

      // Load Book from inputStream
      Book book = (new EpubReader()).readEpub(epubInputStream);

      // Log the book's authors
      Log.i("epublib", "author(s): " + book.getMetadata().getAuthors());

      // Log the book's title
      Log.i("epublib", "title: " + book.getTitle());

      // Log the book's coverimage property
      Bitmap coverImage = BitmapFactory.decodeStream(book.getCoverImage().getInputStream());

      Log.i("epublib", "Coverimage is " + coverImage.getWidth() + " by "
             + coverImage.getHeight() + " pixels");

      // Log the tale of contents
      logTableOfContents(book.getTableOfContents().getTocReferences(), 0);

    } catch (IOException e) {
      Log.e("epublib", e.getMessage());
    }
  }

 /**
  * Recursively Log the Table of Contents
  *
  * @param tocReferences
  * @param depth
  */
  private void logTableOfContents(List<TOCReference> tocReferences, int depth) {
    if (tocReferences == null) {
      return;
    }

    for (TOCReference tocReference : tocReferences) {
      StringBuilder tocString = new StringBuilder();
      for (int i = 0; i < depth; i++) {
        tocString.append("\t");
      }
      tocString.append(tocReference.getTitle());
      Log.i("epublib", tocString.toString());

      logTableOfContents(tocReference.getChildren(), depth + 1);
    }
  }
}

我是编程新手,因此感谢任何帮助或支持。

谢谢。


您可以借鉴翻页阅读器 http://www.pageturner-reader.org/ and epub3阅读器 https://github.com/pettarin/epub3reader

作为一种简单的方法,您可以将 WebView 与 Navigator 和 Navigator Event Listener 一起使用nl.siegmann.epublib.browsersupport包裹。尽管 WebView 不是“原生”的。

这里是步骤:

  1. 在您的类中实现 NavigatorEventListener。
  2. 像下面的代码片段一样初始化 Navigator:

    private void init() {
      mNavigator = new Navigator();
      mNavigator.addNavigationEventListener(this);
      mNavigator.gotoBook(book, this); // book is from your loaded InputStream book
      mNavigator.gotoFirstSpineSection(this);
    }
    
  3. 在您实施的导航执行中添加如下内容:

    @Override public void navigationPerformed(NavigationEvent navigationEvent) {
      if (navigationEvent.isResourceChanged()) {
        int currentSpinePos = navigationEvent.getCurrentSpinePos();
        displayPage(navigationEvent.getCurrentResource(), currentSpinePos);navigationEvent.getCurrentResource().toString());
      }
    }
    
  4. 添加displayPage方法来显示epub:

    private void displayPage(Resource resource, int sectionPos) {
      if (resource == null) {
        return;
      }
      try {
         mWebView.loadDataWithBaseURL("file:///android_asset/data/", data, "text/html", "UTF-8", null);
      } catch (Exception e) {
         Log.d(TAG, "When reading resource "
         + resource.getId()
         + "("
         + resource.getHref()
         + ") :"
         + e.getMessage(), e);
      }
    }
    
  5. Finish.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在原生 Android 应用程序中渲染 epub 文件? 的相关文章

随机推荐

  • 如何将时钟门映射到技术库单元

    我的设计中有以下时钟门 module my clkgate clko clki ena Clock gating latch triggered on the rising clki edge input clki input ena ou
  • AlarmClock.EXTRA_DAYS 如何工作 - Android Studio

    所以我有一个在指定时间设置闹钟的代码 我还想指定一周中的哪一天 到目前为止 我发现的所有示例都使用 Calendar 类 但是 我使用 AlarmClock 这是我的代码 Intent openNewAlarm new Intent Ala
  • 为什么重定向 URL 在 Azure AD B2C 中是完全限定的?

    为什么重定向网址 https learn microsoft com en us azure active directory b2c active directory b2c app registration register a web
  • 编译gcc 4.6.2(无法计算目标文件的后缀)

    编译gcc 4 6 2时出现问题 checking for avr gcc data data6 soft src build gcc 4 6 2 host x86 64 unknown linux gnu gcc xgcc B data
  • 使用 Inkspace 或 Gimp 导出 HTML/CSS [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否可以使用 Inkspace 或 Gimp 设计网页并将其导出为 HTML CSS 我想要一个使用拖放进行设计的解决方案 而不必一直手动编写大量 H
  • 角度材质 - 为树添加分支线?

    我创建了一棵简单的树角度材质树 https material angular io components tree overview https stackblitz com edit angular exhejg vx5i7c file
  • GCC中strlen()的实现在哪里?

    谁能指出我的定义strlen 在海湾合作委员会 我已经 grep 4 4 2 版本大约半个小时了 同时疯狂地谷歌搜索 我似乎找不到在哪里strlen 已实际实施 你应该在 glibc 中查找 而不是 GCC 它似乎是在strlen c 这是
  • 单击模态窗口中的按钮 - 量角器

    我正在为现有应用程序编写量角器测试 我在模式窗口中有一个名为 拒绝 的按钮 我尝试使用以下方法单击它 element by buttonText Decline click 但我收到以下错误 UnknownError unknown err
  • 实体框架的 Code First 在保存时抛出 DbUpdateException

    我正在尝试在 Visual Studio C 项目中创建我的第一个数据库 并向该数据库添加一个实体 我还没有做到这一点 当尝试时 我会得到一个DbUpdateException打电话时SaveChanges on the DbContext
  • 指定的资源名称长度不在 Azure Blob 存储允许的限制内

    当我尝试将 blob 上传到我的网站时 收到错误消息 指定的资源名称长度不在允许的范围内 Azure Storage Account 下面是我的代码 private async Task UploadToAzureBlobStorage s
  • Redux Toolkit 查询未获取数据

    I am trying to fetch data with RTK Query in next js project and everything were fine until I had to fetch some more data
  • C 预处理器可以执行简单的字符串操作吗?

    This is C宏观怪异问题 是否可以编写一个宏 以字符串常量 X 作为参数 并求值为相同长度的字符串 Y 使得 Y 的每个字符都是 X 对应字符的 常量 算术表达式 这是不可能的 对吧 不 C 预处理器将字符串文字视为单个标记 因此它无
  • 如何在 Outlook 2016 中查看电子邮件的 HTML 源代码 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在outlook 2016中查看一封电子邮件的html源代码 它似乎与以前版本的outlook有所不同 我正在运行 Outlook 2
  • 我的应用程序屏幕出现在浏览器中

    我在 Android 上打开浏览器 opera 或 firefox 并在地址栏上写下我的深层链接 当我按浏览器上的 Go 按钮时 它会按预期将我重定向到 我的应用程序 但问题是我的应用程序出现在浏览器上 如图所示 我如何打开我的应用程序并随
  • 相对于光标滚动 Vim,自定义映射

    所以我读过 help scroll cursor真的很喜欢zz 这会将光标所在的行置于窗口中间 我正在寻求帮助来制作一个类似于以下内容的映射zz但将光标所在的行放在窗口高度的 20 或 25 30 等 处 Edit 感谢 ZyX 和 Dra
  • 计算机图形学编程中的翻页是什么意思?

    翻页是什么意思 为什么我们在图形编程中需要它 页面翻转是一种简单的硬件辅助技术 可实现无闪烁图形 已经使用了数十年 它需要硬件的支持 视频子系统必须至少有两个内存区域 页 可能是可见的 其中任何时候都只有一个可见 给定的时刻 视频子系统支持
  • 检查您是否已在 Game Center/GameKit 中解锁成就

    我已经被这个问题困扰了很长一段时间 我了解如何解锁游戏中心的成就 甚至让整个消息系统正常工作 但我不知道如何检查成就是否已解锁 显然这不起作用 GKAchievement achievement GKachievement alloc in
  • 如何在 React 中为嵌套形状提供默认属性?

    React 有没有办法为特定形状的嵌套数组提供默认属性 鉴于下面的示例 可以看到我的第一次尝试 但这并没有按预期工作 static propTypes heading PT string items PT arrayOf PT shape
  • 在 Ubuntu 上安装并启动 H2 数据库

    我想在 Ubuntu 12 10 上使用 H2 数据库 并访问该网站并获取了与平台无关的安装文件 安装说明非常字面意思 要安装软件 请运行安装程序或将其解压缩到您选择的目录 我不是 Linux 新手 所以我以前使用过许多常用的安装过程 但我
  • 如何在原生 Android 应用程序中渲染 epub 文件?

    我正在尝试制作一个 Android 应用程序 它将呈现 epub 文件并在 Android 布局中显示其内容 我做了一个类似的应用程序 使用 pdfRenderer 显示 pdf 它使用位图显示 pdf 页面 如何在 android 中使用