Android实现App内直接预览本地PDF文件

在App内实现直接预览pdf文件,而不是通过调用第三方软件,如WPS office等打开pdf。

主要思路:通过PhotoView将pdf读取为图片流进行展示。

一、首先,获取对本地文件读取的权限

在AndrooidManifest.xml中声明权限,以及页面中动态获取权限。

二、在build.gradle中引入需要的包

    implementation 'com.github.chrisbanes:PhotoView:2.0.0'

三、在项目库地址中添加

以及:

四、添加页面布局文件

添加一个页面布局文件:activity_pdf.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><android.support.v4.view.ViewPagerandroid:id="@+id/vp_pdf"android:layout_width="match_parent"android:layout_height="wrap_content"></android.support.v4.view.ViewPager></LinearLayout >

添加一个适配器布局:item_pdf.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><com.github.chrisbanes.photoview.PhotoViewandroid:id="@+id/iv_pdf"android:layout_width="match_parent"android:layout_height="match_parent"></com.github.chrisbanes.photoview.PhotoView></LinearLayout>

五、打开和关闭的实现代码

public class PdfActivity extends AppCompatActivity {LayoutInflater mInflater;PdfRenderer mRenderer;ViewPager vpPdf;ParcelFileDescriptor mDescriptor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pdf);init();}public void init() {mInflater = LayoutInflater.from(this);vpPdf =findViewById(R.id.vp_pdf);try {openRender();} catch (IOException e) {e.printStackTrace();}}@TargetApi(Build.VERSION_CODES.LOLLIPOP)private void openRender() throws IOException {File file = new File(DataHelper.GetHelpPdfPath());//初始化PdfRendermDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);if (mDescriptor != null) {mRenderer = new PdfRenderer(mDescriptor);}//初始化ViewPager的适配器并绑定MyAdapter adapter = new MyAdapter();vpPdf.setAdapter(adapter);}class MyAdapter extends PagerAdapter {@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic int getCount() {return mRenderer.getPageCount();}@Overridepublic boolean isViewFromObject(View view, Object object) {return view==object;}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic Object instantiateItem(ViewGroup container, int position) {View view = mInflater.inflate(R.layout.item_pdf, null);PhotoView pvPdf = view.findViewById(R.id.iv_pdf);pvPdf.setEnabled(true);if (getCount() <= position) {return view;}PdfRenderer.Page currentPage = mRenderer.openPage(position);Bitmap bitmap = Bitmap.createBitmap(1080, 1760, Bitmap.Config.ARGB_8888);currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);pvPdf.setImageBitmap(bitmap);//关闭当前Page对象currentPage.close();container.addView(view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {//销毁需要销毁的视图container.removeView((View) object);}}
//关闭pdf@Overrideprotected void onDestroy() {super.onDestroy();try{closeRenderer();}catch (Exception ex){ex.printStackTrace();}}//关闭pdf@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)private void closeRenderer() throws IOException {if (mRenderer != null){mRenderer.close();}if (mDescriptor != null){mDescriptor.close();}}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络整体架构

文章目录 1.输入层Input2.卷积层Conv3.激活函数层(一)Sigmoid 函数(二)Tanh 函数(三)修正线性单元ReLU(四)Leaky ReLU函数(带泄露的Relu)(五)参数化ReLU 4.池化层POOL5.全连接层FC6.输出层Output 用全连接神经网络处理大尺寸图像具有三个明显的缺点&#xff1a; ①将图像展开为…

gitlab-ci 集成 k3s 部署spring boot 应用

环境 一台ECS gitlab 16.10 一台ECS gitlab-runner docker方式 一台腾讯云服务器 k3s k3s version v1.30.5k3s1 (9b586704) go version go1.22.6 本地: idea 2024 准备开始 gitlab上创建"api"仓库,本地IDEA 创建spring boot web demo项目k8s-gitlab-demo. 确保能…

写端口-网络测试ping

最近一直在学习网络编程&#xff0c;今天把pyping 部分做一个总结。 Python pyping资料很少&#xff0c;官方例子有限&#xff0c;大神博客很少提及&#xff0c; 经过一番尝试后&#xff0c;总结以下几点用法以便大家以后使用。 from pythonping import ping def test(ip:str…

【计算机网络】计算机网络相关术语

文章目录 NAT概述NAT的基本概念NAT的工作原理1. **基本NAT&#xff08;静态NAT&#xff09;**2. **动态NAT**3. **NAPT&#xff08;网络地址端口转换&#xff0c;也称为PAT&#xff09;** 底层实现原理1. **数据包处理**2. **转换表**3. **超时机制** NAT的优点NAT的缺点总结 P…

跟踪用户状态,http协议无状态 Cookie HttpSession,Session和Cookie的关系

1.概念分析 跟踪用户状态指的是web应用能够分辨请求属于哪个用户&#xff0c;进而记录用户的状态&#xff0c;从而为用户提供连续的针对性的服务。比如有多个客户在同一个购物网站上购物&#xff0c;每一个用户都会有一个虚拟的购物车。当某个客户发送请求将商品添加到购物车时…

使用 Netperf 工具进行 TCP 和 UDP 时延测试

测试目的 通过使用 Netperf 工具评估 TCP 和 UDP 协议的时延性能&#xff0c;分析不同 Payload 大小对时延的影响&#xff0c;为网络性能优化提供数据支持。 测试环境 - **硬件**&#xff1a; - 测试服务器&#xff08;运行 Netperf&#xff09; - CPU: 至少四核 …

基于Vue3+Ts+Vite项目中grpc-Web的应用以及其中的坑

背景&#xff1a; 最近项目中有一个需求&#xff1a;在新项目中使用grpc进行前后端通信。我便基于此需求开始了新的研究。 首先我是想抄作业的&#xff0c;但是翻了很多相关grpc-web的文章&#xff0c;写的都不是很详细&#xff0c;再涉及到grpc-web服务的升级迭代&#xff0…

初学Qt之环境安装与 hello word

环境&#xff1a; Qt Creator 4.11.0 (Community) Qt 5.14.0 目录 1.Qt环境配置 1.1 下载Qt 5.14.0 1.2 注册Qt账号 1.3 安装Qt 1.4 配置环境变量 2.创建项目 2.1 创建一个项目 2.2 初始代码解析 2.3 可视化GUI ​编辑 2.4 hello word 2.4.1 可视化hello word …

线性回归-随机梯度法下降算法预测波士顿房价(附带数据集下载链接, 长期有效)

机器学习基本步骤: ​1.数据获取-导入外部数据集housing_price 数据获取: 听着高大上, 实际上就是把内部/外部数据集加载进来 2.数据基本处理-缺失值处理, 分割数据集, 数据基本处理:实际上就是对数据中缺失的数据和异常的数据进行处理, 然后进行数据集分割 3.特征工程-特…

Spring Boot知识管理系统:创新与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

公开课学习:软件测试面试3大难题

1.验证码机制的处理&#xff1a;自动化遇到验证码怎么办?怎么测试? 流程&#xff1a;先识别元素&#xff0c;再对元素进行操作。实际上&#xff0c;验证码无法用自动化技术操作解决&#xff0c;都是由开发给万能码&#xff0c;或者屏蔽验证码去解决&#xff01;那如果不能屏…

数据结构——优先级队列(堆)

概念&#xff1a; 在操作数据的时候&#xff0c;操作的数据具有优先级&#xff0c;需要返回最高级别的优先级数据或者添加新对象时就需要用到优先级队列。 jdk1.8中的PrioriytQueue底层实现了堆这种数据结构实际上&#xff0c;堆其实就是在完全二叉树进行调整而来。 堆&#x…

C++STL--------vector

文章目录 一、vector常用接口介绍1、initializer_list2、接口有很多类似3、typeid(类型).name()4、find() 函数5、内置类型构造 二、vector()常用接口模拟实现 截图来源网站&#xff1a;https://legacy.cplusplus.com/reference/vector/vector/ 一、vector常用接口介绍 是一个…

哪种护眼大路灯孩子用着最好?公认最好的护眼大路灯

哪种护眼大路灯孩子用着最好&#xff1f;最近也有不少家长关注到了孩子视力健康的这个情况&#xff0c;很着急开始寻找各种能够减少孩子因为不良光线影响视力健康的方法&#xff0c;其中大路灯以良好的表现成为家长们的首选&#xff0c;但快速发展的市场中&#xff0c;却涌入了…

Golang 逃逸分析(Escape Analysis)理解与实践篇

Golang 逃逸分析&#xff08;Escape Analysis&#xff09;理解与实践篇 文章目录 1.逃逸分析2.相关知识&#xff08;栈、堆、GC分析&#xff09;3.逃逸分析综合-实践 demo 逃逸分析&#xff08;Escape Analysis&#xff09;是编译器在编译期进行的一项优化技术&#xff0c;是Gl…

Qt QTableWidget多行表头、表头折行显示

表头折行显示 //方法一QVector<QString> chNames;chNames<<"表头1"<<"表头2长命名abcdefg";ui.tableWidget->setColumnCount(chNames.size()1);ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromL…

【C】C语言常见概念~

C语言常见概念 转义字符 转义字符&#xff0c;顾名思义&#xff0c;转变原来意思的字符 比如 #include <stdio.h> int main() {printf("abcndef");return 0; }输出的结果为&#xff1a; 将代码修改一下&#xff1a; #include <stdio.h> int main(…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

SpringBoot基础(五):集成JUnit5

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 SpringBoot基础(五)&#xff1a;集成JUnit5 目录 一、JUnit…

敏捷开发 与 Scrum

‌敏捷开发的概念起源于20世纪90年代末期&#xff0c;旨在解决传统软件开发方法中存在的效率低下问题。‌ 传统软件开发方法因其繁琐的过程和对文档的严格要求&#xff0c;导致了“重型化危机”&#xff0c;这使得开发效率大幅下降。为了应对这些问题&#xff0c;敏捷方法应运…