Android pdf viewer在android studio应用问题说明详解

之前一直是做.NET开发的,最近需要弄一个新闻app,能力有限,只能借助HTML5 WebAPP+android studio来完成这项工作。
android studio主要用WebView来加载发布好的WebApp,打包生产APP。

其中由于显示一些pdf文档,所以研究了一下,记录一下心得,同时也希望帮助到新手们。

android 显示网络pdf,基本原理:先将pdf文件通过DownloadManager下载到手机sdk某个文件夹中,然后通过android-pdf-viewer插件进行显示。

android-pdf-viewer插件可以直接到github上下载,地址:https://github.com/barteksc/AndroidPdfViewer
或者直接到发布好的页面下载:https://github.com/barteksc/AndroidPdfViewer/releases
我下载的是:AndroidPdfViewer-2.1.0版本zip包

将下载AndroidPdfViewer-2.1.0包解压出来,再你的app项目中,打开 File -> New -> Import Module 选择到刚才解压的文件夹

本人目录是:D:\AndroidStudioProjects\AndroidPdfViewer-2.1.0\android-pdf-viewer

完成后,回提示先ERROR:

Error:Plugin with id ‘com.github.dcendents.android-maven' not found.

解决方法:

点击你的工程Gradle Scripts目录下的bulid.gradle (Project:你的工程名)

buildscript {
repositories {
jcenter()
}
dependencies {
classpath ‘com.android.tools.build:gradle:2.0.0'
}
}

中dependencies的下添加 classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3',

Mark Modules之后,出现新的ERROR:

Error:Plugin with id ‘com.jfrog.bintray' not found.

此时同样在dependencies下添加:classpath “com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0”

再次Mark Modules就不会报错了。

先就可以开始使用 android-pdf-viewer 插件了,

别忘记引用权限问题哦

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

先代码为项目中report activity.java,实现了接收另外一个activity跳转过来同时传递参数pdf地址,然后通过DownloadManager下载完成之后,显示pdf。

package cn.cgrs.myphone;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.provider.OpenableColumns;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;
import com.github.barteksc.pdfviewer.listener.OnLoadCompleteListener;
import com.github.barteksc.pdfviewer.listener.OnPageChangeListener;
import com.github.barteksc.pdfviewer.scroll.DefaultScrollHandle;
import com.shockwave.pdfium.PdfDocument;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
public class Report extends AppCompatActivity implements OnPageChangeListener, OnLoadCompleteListener {
private com.github.barteksc.pdfviewer.PDFView pdfView ;
private TextView textView;
private DownloadManager downloadManager;
private SharedPreferences prefs;
private static String DL_ID = "downloadId";
Integer pageNumber = 0;
String pdfFileName = "yyy.pdf";
Uri uri;
String AUrl;
private Boolean isDown = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_report);
Intent intent = getIntent(); // 获取 Intent
AUrl = intent.getStringExtra("url"); // 获取 String 值
Log.e("接收url:",AUrl);
//AUrl = "http://www.tyyq.cn/xhsapp/download/a03790b7f27243eeada01537a2ce2f77.pdf";
String[] exts = AUrl.split("/");
pdfFileName = exts[exts.length-1];
Log.e("pdf文件名:",pdfFileName);
String pdfName = Environment.getExternalStorageDirectory() +
"/download";
File file = new File(pdfName, pdfFileName);
pdfView = (com.github.barteksc.pdfviewer.PDFView)findViewById(R.id.pdfView);
textView = (TextView) findViewById(R.id.textView);
if(file.exists()){
Log.e("Tip:","报告已经存在!");
//文件已经存在,则直接显示
uri = Uri.fromFile(file);
displayFromUri(uri);
textView.setVisibility(View.GONE);
pdfView.setVisibility(View.VISIBLE);
}
else{
isDown = true;
}
//Log.e("prefs字符串:",prefs.toString());
}
@Override
protected void onResume(){
super.onResume();
if(isDown)
{
try{
Log.e("Tip:","报告不存在,需要下载!");
DL_ID = pdfFileName;
//文件不存在需要先下载
downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
prefs = PreferenceManager.getDefaultSharedPreferences(this);
StartReport();
}
catch (Exception ex)
{
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
//unregisterReceiver(receiver);
try {
unregisterReceiver(receiver);
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("Receiver not registered")) {
// Ignore this exception. This is exactly what is desired
} else {
// unexpected, re-throw
throw e;
}
}
}
//下载报告启动函数
protected void StartReport() {
// TODO Auto-generated method stub
if(!prefs.contains(DL_ID) || true) { //
// String url = AUrl;
//Log.e("-----",AUrl);
//String[] exts = url.split("/");
//pdfFileName = "97b49c0822c14a01b3ebc273679bc6bf.pdf";
//exts[exts.length-1];
String url = AUrl;//"http://www.tyyq.cn/RollImage/11.pdf";
Log.e("开始下载url:",AUrl);
//开始下载
Uri resource = Uri.parse(encodeGB(url));
DownloadManager.Request request = new DownloadManager.Request(resource);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setAllowedOverRoaming(false);
//设置文件类型
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url));
request.setMimeType(mimeString);
//在通知栏中显示
//设置通知栏标题
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
request.setDescription("舆情报告正在下载");
//request.setShowRunningNotification(true);
request.setVisibleInDownloadsUi(true);
//sdcard的目录下的download文件夹
request.setDestinationInExternalPublicDir("/download/", pdfFileName);
request.setTitle("舆情报告");
long id = downloadManager.enqueue(request);
//保存id
prefs.edit().putLong(DL_ID, id).commit();
} else {
Log.e("提示:","下载已经开始,检查状态");
//下载已经开始,检查状态
queryDownloadStatus();
}
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
/**
* 如果服务器不支持中文路径的情况下需要转换url的编码。
* @param string
* @return
*/
public String encodeGB(String string)
{
//转换中文编码
String split[] = string.split("/");
for (int i = 1; i < split.length; i++) {
try {
split[i] = URLEncoder.encode(split[i], "GB2312");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
split[0] = split[0]+"/"+split[i];
}
split[0] = split[0].replaceAll("\\+", "%20");//处理空格
return split[0];
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//这里可以取得下载的id,这样就可以知道哪个文件下载完成了。适用与多个下载任务的监听
Log.v("intent", ""+intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0));
queryDownloadStatus();
}
};
private void queryDownloadStatus() {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(prefs.getLong(DL_ID, 0));
Cursor c = downloadManager.query(query);
if(c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch(status) {
case DownloadManager.STATUS_PAUSED:
Log.v("down", "STATUS_PAUSED");
case DownloadManager.STATUS_PENDING:
Log.v("down", "STATUS_PENDING");
case DownloadManager.STATUS_RUNNING:
//正在下载,不做任何事情
Log.v("down", "STATUS_RUNNING");
break;
case DownloadManager.STATUS_SUCCESSFUL:
//完成
Log.v("down", "下载完成");
String pdfName = Environment.getExternalStorageDirectory() +
"/download";
File file = new File(pdfName, pdfFileName);
uri = Uri.fromFile(file);
Log.e("----",uri.toString());
displayFromUri(uri);
textView.setVisibility(View.GONE);
pdfView.setVisibility(View.VISIBLE);
break;
case DownloadManager.STATUS_FAILED:
//清除已下载的内容,重新下载
Log.v("down", "STATUS_FAILED");
downloadManager.remove(prefs.getLong(DL_ID, 0));
prefs.edit().clear().commit();
break;
}
}
}
/*pdf显示函数集合*/
private void displayFromUri(Uri urii) {
//pdfFileName = getFileName(urii);
pdfView.fromUri(urii)
.defaultPage(pageNumber)
.onPageChange(this)
.enableAnnotationRendering(true)
.onLoad(this)
.scrollHandle(new DefaultScrollHandle(this))
.load();
}
public void onResult(int resultCode, Intent intent) {
if (resultCode == RESULT_OK) {
uri = intent.getData();
displayFromUri(uri);
}
}
@Override
public void onPageChanged(int page, int pageCount) {
pageNumber = page;
setTitle(String.format("%s %s / %s", pdfFileName, page + 1, pageCount));
}
public String getFileName(Uri uri) {
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
if (result == null) {
result = uri.getLastPathSegment();
}
return result;
}
@Override
public void loadComplete(int nbPages) {
PdfDocument.Meta meta = pdfView.getDocumentMeta();
printBookmarksTree(pdfView.getTableOfContents(), "-");
}
public void printBookmarksTree(List<PdfDocument.Bookmark> tree, String sep) {
for (PdfDocument.Bookmark b : tree) {
// Log.e(TAG, String.format("%s %s, p %d", sep, b.getTitle(), b.getPageIdx()));
if (b.hasChildren()) {
printBookmarksTree(b.getChildren(), sep + "-");
}
}
}
}

以上所述是小编给大家介绍的Android pdf viewer在android studio应用问题说明详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android 打开网络上pdf文件

    之前写过一篇Android打开本地pdf文件的文章,最后总结的时候说,后面一定要拓展库,让其也能打开网络的的pdf文件.今天终于可以兑现承诺了.frok一份代码https://github.com/JoanZapata/android-pdfview,源码地址:http://xiazai.jb51.net/201704/yuanma/android-pdfview-master_jb51.rar,开始改造一番. 1.基本思路: 打开网络pdf 思路整体还是来源与图片的加载. android中加载

  • Android 打开本地pdf文件

    Android 中打开pdf文件也是一种很常见的场景,但是上网找了好多资料,有用WebView加载的,但是要用vpn才能搞,最后发现一个库挺不错的,再次分享给大家 android-pdfview.下面主要说一下该库的使用方法. 1. 该库的下载地址 https://github.com/JoanZapata/android-pdfview 源码下载:http://xiazai.jb51.net/201704/yuanma/android-pdfview-master_jb51.rar 2. an

  • Android 下载并打开PDF,Doc,Dwg文档实例

    今天项目中遇到这样一个需求 ,根据后台接口里pdf,doc,dwg文档的地址 是一个URL ,需要根据文档的url 下载到本地(内部存储或内存卡)并用手机中能打开该文档的软件弹出来并打开,(这里需要做一个缓存,第一次查看这个文档是在服务器上下载并打开,以后打开不需要下载直接打开本地的文档)在网上找了些资料 写了以下代码,下面分享给大家; 效果图: 代码: 这是一个单独的类 首先接收intent传过来的url我是用url的后14位作为存储本地的文件名(这里根据自己服务器的文件命名规则而定) 拿到文

  • Android pdf viewer在android studio应用问题说明详解

    之前一直是做.NET开发的,最近需要弄一个新闻app,能力有限,只能借助HTML5 WebAPP+android studio来完成这项工作. android studio主要用WebView来加载发布好的WebApp,打包生产APP. 其中由于显示一些pdf文档,所以研究了一下,记录一下心得,同时也希望帮助到新手们. android 显示网络pdf,基本原理:先将pdf文件通过DownloadManager下载到手机sdk某个文件夹中,然后通过android-pdf-viewer插件进行显示.

  • sweet alert dialog 在android studio应用问题说明详解

    看到这个sweet-alert-dialog很亲切,因为前端开发本人用的提示就是这个js插件,java牛人很厉害,直接弄成一个java包插件,Good! 下面记录如何引用到工程,并使用: sweet-alert-dialog插件可以直接到github上下载 地址:https://github.com/pedant/sweet-alert-dialog 或者直接到发布好的页面下载: https://github.com/pedant/sweet-alert-dialog/releases 我下载的

  • Android 虚拟机中的内存分配与OOM问题详解

    目录 背景知识 一.Android VM的内存空间 1.查看内存的API 二.Android VM内存分配流程 小结 三.出现OOM的建议解决方案 背景知识 Android中每个App默认情况下是运行在一个独立进程中的, 而这个独立进程正是从Zygote孵化出来的VM进程, 也就是说, 也就是说每个Android APP在运行时会启动一个Java虚拟机. 并且系统会给它分配固定的内存空间(手机厂商会根据手机的配置情况来对其进行调整). 一.Android VM的内存空间 Android是一个多任

  • 基于Android studio3.6的JNI教程之opencv实例详解

    基本环境: Android studio3.6 NDK:r14b(尽量使用该版本) Opencv3.4.1 android sdk (1)新建工程OpenCVDemo,选择,一定要选择Native c++类型,最后要选c++14支持. (2)File->Project Structure->SDK Location,设置这3个路径,NDK选择r14b. (3)任意找一张图片,复制到res/drawable. (4)修改布局文件res/layout/ activity_main.xml <

  • 基于Android studio3.6的JNI教程之helloworld思路详解

    jdk环境变量配置: path中增加下面2个路径,也就是android studio的路径,android有自带的jdk. E:\Android\Android Studio\jre\bin E:\Android\Android Studio\bin 新建工程: 一定要选择Native c++类型,最后要选c++11支持. SDK设置: File->Settings File->Project Structure 首先确定工程的目录结构,然后尝试运行一下工程,使用模拟器,确保工程没问题, 在M

  • Android Studio3.2中导出jar包的过程详解

    1.)说明. 本项目是来自github上的一个项目roottools (https://github.com/Stericson/RootTools),这里只是想本地编译后输出下jar包供自己进行使用. 2.)操作步骤. 步骤1)按之前你熟悉的方式进行开发待输出为jar的项目. 步骤2) 一般的gradle设置,比如gradle版本,android sdk的编译,目标,最小要求版本..还有compileOptions的jdk版本设置等. 步骤3)gradle中的apply plugin设置: a

  • Android代码检查规则Lint的自定义与应用详解

    目录 前言: 什么是Lint 自定义Lint流程: 1. 新创建module,Module类型选择Java or Kotlin Library, 暂时命名lint_tools 2. 在build.gradle中引入lint的依赖 3. 本地创建个资源id命名检查规则,用来规范项目中的id统一命名 4. 实现IssueRegistry并添加对应的自定义Issue: 5. 在module(lint_tools)中对应的build.gradle中配置如下信息: 6. 在需要进行lint检查的modul

  • Android中gson、jsonobject解析JSON的方法详解

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, ke

  • Android Webview上的ssl warning的处理方式详解及实例

    Android Webview上的ssl warning的处理方式详解 前言: 因为最近遇到google pay上汇报的安全漏洞问题,需要处理ssl warning. 安全提醒 您的应用中 WebViewClient.onReceivedSslError 处理程序的实施方式很不安全.具体来说,这种实施方式会忽略所有 SSL 证书验证错误,从而使您的应用容易受到中间人攻击.攻击者可能会更改受影响的 WebView 内容.读取传输的数据(例如登录凭据),以及执行应用中使用 JavaScript 的代

  • Android屏幕锁屏弹窗的正确姿势DEMO详解

    在上篇文章给大家介绍了Android程序开发仿新版QQ锁屏下弹窗功能.今天通过本文给大家分享android锁屏弹窗的正确姿势. 最近在做一个关于屏幕锁屏悬浮窗的功能,于是在网上搜索了很多安卓屏幕锁屏的相关资料,鉴于网上的资料比较零碎,所以我在这里进行整理总结.本文将从以下两点对屏幕锁屏进行解析: 1. 如何监听系统屏幕锁屏 2. 如何在锁屏界面弹出悬浮窗 如何监听系统屏幕锁屏 经过总结,监听系统的锁屏可以通过以下两种方式: 1) 代码直接判定 2) 接收广播 1) 代码直接判定 代码判断方式,也

随机推荐