Android应用集成Office文件能力彻底攻略

不一样于iOS,Android的webView不支持打开office和pdf文档,因此当咱们遇到在应用内打开office和pdf文档的需求时,每每没法从系统原生功能去支持。这篇文章的写下笔者在Android应用中集成office和pdf文件能力的心得,附上demo地址:github.com/windinwork/…html

1、肯定解决方案

Android应用打开office和pdf文件。经常使用的有如下四种解决方案:git

  1. 在线网页打开文件方案:经过微软或谷歌提供的在线页面打开office和pdf文件
  2. 集成相关文档处理开源库:经过集成开源库相似于AndroidPdfViewer
  3. 经过系统中的第三方应用打开文档
  4. 集成腾讯x5 sdk文件能力

四种方案各有优劣,这里笔者选择了x5 sdk为主要手段,第三方应用辅助的这样一种解决方案github

2、集成x5内核

腾讯官方提供的x5内核有两个版本,这里选择具备文件能和的sdk:web

接下来的集成能够参考x5内核接入文档,这里便不详述。集成的主要工做即是集成jar包和so文件,并在Application初始化时调用QbSdk.initX5Environment(context, callback)来完成初始化工做。api

3、集成TbsReader

x5内核中提供了TbsReaderView,让咱们能够经过这个类在App中显示文档。考虑到TbsReaderView这个类具备生命周期的方法,咱们把它封装在一个Fragment中,方便咱们的调用。TbsReaderView的主要方法有两个,一个是preOpen(String, boolean),另外一个是openFile(Bundle)。preOpen(String, boolean)是用来检测x5文件能力是否成功初始化和是否支持打开文件的格式,当符合打开文件的条件时该方法返回true;openFile(Bundle)则是在preOpen(String, boolean)的返回值为true的状况进行调用,顾名思义这个方法是用来打开文件的,其中bundle用来传入文件路径。浏览器

String path = file.getPath();
String format = parseFormat(path);
boolean preOpen = mReaderView.preOpen(format, false); // 该状态标志x5文件能力是否成功初始化并支持打开文件的格式
if (preOpen) { // 使用x5内核打开office文件
    Bundle bundle = new Bundle();
    bundle.putString("filePath", path);
    bundle.putString("tempPath", StorageUtils.getTempDir(context).getPath());
    mReaderView.openFile(bundle);
}
复制代码

有了这部分核心代码,TbsReaderView基本上就能打开Office和PDF文件了。bash

4、完善文件能力

市面上的安卓手机各式各样,虽然集成了TbsReaderView,可是仍是会收到用户反馈说没法打开Office文件。这是由于用户手机上的x5文件能力没有初始化成功,至于为何没有初始化成功,缘由还没法肯定。针对这部分用户,咱们须要在他们没法使用TbsReaderView浏览Office文件的状况下,提供另外的途径去打开Office文件。大体思路是检测到TbsReaderView没法打开Office或PDF时,跳转到第三方应用去打开。这里x5的jar包提供了这样一个api:openFileReader(Context, String, HashMap<String, String>, ValueCallback)用来使用第三方应用打开文件,而且支持前往下载具备Office浏览功能的QQ浏览器,这样的功能对用户比较友好,咱们能够直接拿来用。ide

然而,x5的jar包中使用第三方应用打开时调用了Uri.fromFile(file),这个生成文件Uri的方法在Android7.0如下有效,但在Android7.0及以上会形成崩溃,这是Android7.0的文件权限管理致使。为了使Android7.0及以上的用户能够正常跳转到第三方应用打开,咱们须要使用FileProvider去获取Uri,但代码在Jar包中写死了。幸运的是,通过屡次尝试,发现能够将跳转到第三方应用打开的这部分代码复制出来,修正Uri.fromFile(file)的代码以正常调用,免去了要修改jar的麻烦。这里笔者把这部分代码封装在一个叫TbsReaderAssist的类中,辅助调用。ui

这样一来,一个比较完善的打开Office和PDF的功能就算作完成。spa

String path = file.getPath();
String format = parseFormat(path);
boolean preOpen = mReaderView.preOpen(format, false); // 该状态标志x5文件能力是否成功初始化并支持打开文件的格式
if (preOpen) { // 使用x5内核打开office文件
    Bundle bundle = new Bundle();
    bundle.putString("filePath", path);
    bundle.putString("tempPath", StorageUtils.getTempDir(context).getPath());
    mReaderView.openFile(bundle);
} else { // 打开文件失败,多是因为x5内核未成功初始化引发
    if (QbSdk.isSuportOpenFile(format, 1)) { // 再次检查文件是否支持
        HashMap<String, String> params = new HashMap<>();
        params.put("style", "1");
        params.put("local", "false");
        TbsReaderAssist.openFileReader(context, path, params, null);
    }
}
复制代码

5、总结

这里笔者写了一个App打开Office或PDF文件的解决方案,我的认为对于一个App来讲是相对完善的处理。这里是demo的地址:github.com/windinwork/…,共享出来,可让有须要作相似功能的小伙伴少走些弯路。

相关文章
相关标签/搜索