cordova程序加载pdf文件的2种方法(ios/android)_weixin_30394333的博客-程序员宅基地

前言

     公司目前的前端架构是微信端由vue全家桶负责h5网站的单页应用,android端和ios端则选择cordova打包成apk和app。其中,有一个业务逻辑是点击某个链接进入pdf的展示,h5的方案是使用vue-pdf,h5网站运行良好。可是,等到打包成apk时却显示不出来。cordova程序加载pdf文件并不是那么轻松。

     目录

     1.使用inappbrowser(适合ios)

     2.cordova-plugin-file-opener2(android)

1.使用inappbrowser(适合ios)

      参考: Linking to PDFs in cordova apps

      ios原生的支持pdf的浏览,所以我们只要完成pdf显示和返回页面(完成按钮)这个流程就好了。注意,提到返回页面,因为直接通过链接的方式显示PDF,会导致无法返回页面。比如下面的例子。

显示pdf但无返回的做法:
 1 <p>
 2     <a href="pdf/fund.pdf">Regular Ole Link</a>
 3     //不安装任何插件,直接a标签打开
 4 </p>
 5 <p>
 6     <button id="loadPDF1">document.location.href</button>
 7    //
 8 </p>
 9 
10 //js部分
11 document.addEventListener('deviceready', init, false);
12 function loadPDF1() {
13     console.log('loadPDF1');
14     document.location.href='pdf/fund.pdf';
15 }

    正确方案:使用inappbrowser(适合ios)

1.安装inappbrowser

cordova plugin add cordova-plugin-inappbrowser

参考:cordova-plugin-inappbrowser

2.js部分

document.addEventListener('deviceready', init, false);
function init() {
    document.querySelector('#loadPDF2').addEventListener('touchend', 
loadPDF2,false);
        }
function loadPDF2() {
    console.log('loadPDF2');
    var ref = cordova.InAppBrowser.open('pdf/fund.pdf', '_blank', 'location=no');
}

ios测试截图:

 额外的一些些话(对vue项目不感兴趣的可以skip咯):

//Vue项目
//正确示范
if(this.ios==true){
    if(cordova){
       var ref =cordova.InAppBrowser.open('assets/foo.pdf', '_blank', 'location=no');
       }
    }
//错误示范
if(this.ios==true){
//这个时候运行vue项目报错,Uncaught ReferenceError: cordova is not defined
//明明this.ios这个if语句的代码在vue项目并没有进这个分支,那么如何知道cordova呢
//答案是变量提升。不理解,自行百度哦。
    var ref =cordova.InAppBrowser.open('assets/foo.pdf', '_blank', 'location=no');
          
} 

2.cordova-plugin-file-opener2(适合android)

     android原生并不支持pdf浏览。那么使用fileopener2。

    参考: Linking to PDFs in cordova apps

    首先,[root]/config.xml添加内容,安装file-opener2和cordova-plugin-file。

     命令为:

cordova plugin add cordova-plugin-file

cordova plugin add [email protected]

     [root]/config.xml:

<plugin name="cordova-plugin-file" spec="^6.0.1" />
<plugin name="cordova-plugin-file-opener2" spec="1.0.11" />

    然后,要求android  target为23。

    最后,贴代码如下:

<div>
          
           <button id="btn">打开PDF</button>

</div>
<script type="text/javascript" src="cordova.js"></script>
<script>
            document.addEventListener('deviceready', init,false);
            function init(){
                document.getElementById("btn").onclick=function(){
                    window.resolveLocalFileSystemURL(cordova.file.applicationDirectory +  'www/pdf/lustForLife.pdf', function(fileEntry) {
                        console.log(fileEntry);
                        window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory, function(dirEntry) {
                            console.log(dirEntry);
                            fileEntry.copyTo(dirEntry, 'lustForLife.pdf', function(newFileEntry) {
                                console.log(newFileEntry);
                                console.log(cordova.plugins.fileOpener2);
                                cordova.plugins.fileOpener2.open(newFileEntry.nativeURL,'application/pdf',
                                    {
                                        error : function(e) {
                                            console.log(e);
                                        },
                                        success : function () {
                                            console.log('file opened successfully');
                                        }
                                    }
                                );
                            });
                        });
                    });
                }
            }
</script>

    报错解决   exposed beyond app through Intent.getData()

    file:///storage/emulated/0/Android/data/io.cordova.hellocordova/files/lustForLife.pdf exposed beyond app through Intent.getData()很不幸,如果你安装的Sdk是24及以上版本,因为不支持file schema,会报错。那么我们就修改target就好啦。

    如何修改targetSdkVersion?

    android studio方案

    step1:用android studio选择要安装的api level,我选择的是22。如果还未安装,选择好后点击OK就能自动帮你下载了。

     

step2:打开cordova的安卓项目,位于[root]/platform/android。修改build.gradle

     

step3:打开安卓项目的AndroidManifest.xml。修改android:targetSdkVersion=22。

step4:打包>>build>>build APK(s)

成功!

效果如图:

 github地址:https://github.com/MengChen2015/cnblogs-code

 

 

         

 

 

    

     

    

转载于:https://www.cnblogs.com/chenmeng2062/p/9179640.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30394333/article/details/97981122

智能推荐

Android高级UI开发(二)RecyclerView控件使用----列表项的单击事件、添加(删除)列表项_iewbyid.setlayoutmanager(new linearlayoutmanager_冉航--小虾米的博客-程序员宅基地

上篇文章介绍了RecyclerView控件的基本用法,我们已经知道它是一个ListView的升级版,可轻松的展示各种列表风格,例如水平列表、垂直列表、网格列表、瀑布流列表等。但是,我们项目中仅仅展示数据是不够的,我们经常还有列表项的单击事件、添加列表项、删除列表项等。今天我们就着重讲解一下RecyclerView列表项的单击事件、添加列表项、删除列表项。效果:1.Recy..._iewbyid.setlayoutmanager(new linearlayoutmanager

finalshell java_[mcj]FinalShell无法连接ssh:Session.connect: java.io.IOException: End of IO Stream Read..._weixin_39968592的博客-程序员宅基地

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: UNPROTECTED PRIVATE KEY FILE! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Permissions 0660 for '/...

vue项目中存放静态资源目录assets与static的区别_vue-cli2 打包 会编译assets目录嘛_Fiona Fang的博客-程序员宅基地

最近使用了vue-cli4创建了项目,项目目录里面取消了static目录,因为之前的项目里面存在static目录,有点迷这两个文件夹的区别,然后就各种查找资料,总结如下(也不知道有没有错…)assetsassets中的文件会经过webpack打包,重新编译,推荐该方式。staticstatic中的文件,不会经过编译。项目在经过打包后,会生成dist文件夹,static中的文件只是复制一遍而已。在html文件里面 可以使用。但是因为webpack使用的是commenJs规范,所以通过js动态添_vue-cli2 打包 会编译assets目录嘛

Docker 推送跨平台镜像至 docker hub_no such manifest_linmengmeng_1314的博客-程序员宅基地

docker的神奇之处,目前大概也有了点初步的了解了,由于最近在处理跨平台构建镜像的问题,发现docker 在拉取镜像时,会自动根据当前机器的架构,拉取符合当前架构的镜像,这样保证了镜像拉下来之后可以正常运行。这也是为什么有时候我们拉取别人构建的镜像,无法运行的问题。如果镜像的架构和当前机器的架构不一致,则运行镜像的时候,容器会立马停掉,然后日志里面显示可恶的:standard_init_linux.go:228: exec user process caused: exec format error_no such manifest

python练手经典100例-10 个最值得 Python 新人练手的有趣项目-程序员宅基地

原标题:10 个最值得 Python 新人练手的有趣项目 作者 | Claire D. Costa编译 | Wendy有很多 Python 新手留言问:"Python 入门很久了,但项目经验很少,有没有什么项目,可以让自己实践一下呢?”这是个很普遍的问题,首先你要想好做什么类别的项目,总体来说,项目分为三类:Web构建一个 Web 应用发布在网络上让用户访问使用。需要实现 Web 应用的..._python100练

x264代码精简优化_随风而去飘飘飘的博客-程序员宅基地

x264优化(一) 现在VS2008上做一些代码精简性优化。如果代码体积过于庞大的话会出现在DSPload不进去的情况,也会给空间存储分配带来麻烦。1、去掉common.c中的x264_log()和x264_log_default()函数(主要输出信息的分类),改用printf即可。2、对有些fprintf()去掉即可,尤其关于stderr的,有些输出信息还是保留为好,方便观察结果

随便推点

std::list与std::deque用法_std::list std::deque_泡泡茶壶Wending的博客-程序员宅基地

list是一个双向链表,因此它的函数也都要从链表的角度来进行理解。 迭代器返回迭代器,和listbegin()end()返回反向迭代器,和listrbegin()rend() 返回第一个、最后一个元素front()back() 插入数据向链表头、尾插入元素push_fro_std::list std::deque

关于opencart 社交登录facebook登录facebook Redirect URL-程序员宅基地

有些插件是有写Redirect URL是什么地址,如果没有写的,那么可以在配置测试的过程中,通过社交登录按钮点击登录跳转后的浏览器里的URL地址中获取这个Redirect URL.比如so social login这个插件就没有注明Redirect URL是什么,通过实操发现地址是这个:/index.php?route=extension/module/so_sociallogin/FacebookLogin(前面加上域名)如果URL中有特殊字符,参考下面的:网址URL中特殊字符转义编._opencart 社交登录

java的int数组初始化_java – int数组初始化_weixin_39588209的博客-程序员宅基地

首先要理解的是,局部变量存储在堆栈中,这些变量没有使用它们的默认值显式初始化。实例变量存储在堆中,默认情况下使用默认值进行初始化。而且,在堆上也创建对象,无论实例引用变量是否保存其引用,还是本地引用变量。现在,发生的是,当您将数组引用声明为局部变量时,并使用数组初始化:int[] in = new int[5];数组引用(in)存储在堆栈中,为数组分配一个内存,能够在堆上保存5个整数元素(记住,对..._java 初始化一个int数组

LNK2019: 无法解析的外部符号 整理___imp__wassert_Terod的博客-程序员宅基地

无法解析的外部符号是Windows下C++编译的常见链接错误,收集整理备忘.本文随遇到的问题长期更新我目前遇到的错误可以分为3类:1.编译工具链修改了对应库函数的定义2.编译参数导致定义和链接库不一致3.库依赖冲突常见__imp__xxx未定义是因为导出函数前有__declspec(dllimport)对于2,编译参数导致定义和链接库不一致下列函数是因为VC编译选项产生VC在/MD和/MDd编译选项时会定义_DLL宏,这时STL就定义了__declspec(dlli.___imp__wassert

[Flink 学习] -- 编译 CDH-6.3.0 版本的 Flink 1.9.0_cdh6.3.0集成的kafka是哪个scala版本-程序员宅基地

前言 由于 Apache Flink 的开源二进制包未提供 HDP、MapR和 CDH 的下载,所以,如果要兼容基于这些厂商的库编译 Apache Flink。本文主要介绍使用 CDH 的库进行编译 Apache Flink 1.9.0,希望对读者有所帮助。内容 1、环境 Jdk 1.8、macOS10.14.6、Maven 3.6.2和Scala-2.11...._cdh6.3.0集成的kafka是哪个scala版本

JavaScript内置对象之String_javascript内置对象 string_橘子:o的博客-程序员宅基地

一、字符串的定义:方法1:var str = "hello"; //string方法2:var str = new String("hello"); //object方式3:var str = String("hello"); //string二、字符串的属性:length: 表示字符串的长度var str = "hello";console.log(str.length..._javascript内置对象 string

推荐文章

热门文章

相关标签