Android PdfView实现预览PDF

最近有一个预览pdf的功能要去实现,就是纯展示 。同时附带介绍了计时器的实现,即在阅读的时候计算一下用户读了多久 就是为了展示一个阅读时间。
首先就是在build.gradle中添加依赖

  //pdfView
    implementation 'com.github.barteksc:android-pdf-viewer:2.7.0-beta.1'

接下来是在xml中的引用

    <com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdfView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

注意:pdfView的高一定要match_parent 撑满整个屏幕
最后是Activity的引用

//在Activity的一些绑定布局  绑定id就省略掉了
//需要定义的一些相关字段
    private String cacheUrl;
    private Handler handler;
    private String pdfName; 
    String pdfPath;
    boolean flag = false;
    boolean isFirst = true;

//------------------------------------------------------------
//计时器相关定义
    private int seconds = 0;
    private boolean running = false; //计时状态
    private boolean wasRunning = false; //保存running的状态
    private int trainId;//文件id
//onCreate中做如下操作   picUrl 只是测试使用 最后需要对接你们后端给的相关接口
  String picUrl = "http://www.nuaa.edu.cn//_upload/article/files/3d/8d/78ed42f44031bcb6793b0eb27af1/8e6ad93b-4902-4fd8-bba5-bfabaf852885.pdf";
        pdfPath = picUrl;
        dowloadPDF(picUrl);

//查看pdf的方法
  public void seePdf(File file) {
        pdfView.fromFile(file)
                .enableSwipe(true)
                .swipeHorizontal(false)
                .enableDoubletap(true)
                .defaultPage(0)
                .enableAnnotationRendering(true)
                .password(null)
                .onPageScroll(new OnPageScrollListener() {
                    @Override
                    public void onPageScrolled(int page, float positionOffset) {//当pdf开始滑动就开始计时,如果不需要 这个方法可以不要
                        if (flag) {
                            if (isFirst) {
                                Log.e("ping", "开始倒计时");
                                running = true;//这里插入了一个倒计时的方法  为的是知道用户阅读了多久  显示一个时间
                                isFirst = false;
                            }
                        } else {
                            flag = true;
                        }
                    }
                })
                .load();

    }


//下载pdf的方法
    public void dowloadPDF(String str) {
        this.cacheUrl = getCacheDir().getAbsolutePath();
        String str2 = this.pdfPath;
        if (str2 == null) {
            Log.e("ping", "暂无文件");
            return;
        }
        String[] split = this.pdfPath.split("/");
        if (split == null || split.length <= 0) {
            this.pdfName = SystemClock.currentThreadTimeMillis() + ".pdf";
        } else {
            this.pdfName = split[split.length - 1];
        }
        final File file = new File(this.cacheUrl, this.pdfName);
        if (file.exists()) {
            seePdf(file);
            return;
        }
        new OkHttpClient().newCall(new Request.Builder().url(str).build()).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                Log.e("ping", "下载失败");
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                Log.e("ping", "下载完成");
                BufferedSink bufferedSink = null;
                try {
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    bufferedSink = Okio.buffer(Okio.sink(file));
                    bufferedSink.writeAll(response.body().source());
                    bufferedSink.close();
                    if (TrainDetailActivity.this.handler == null) {
                        TrainDetailActivity.this.handler = new Handler(Looper.getMainLooper());
                    }
                    TrainDetailActivity.this.handler.post(new Runnable() {
                        public void run() {
                            TrainDetailActivity.this.seePdf(file);
                        }
                    });
                    if (bufferedSink == null) {
                        return;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    if (0 == 0) {
                        return;
                    }
                } catch (Throwable th) {
                    if (0 != 0) {
                        bufferedSink.close();
                    }
                    throw th;
                }
                bufferedSink.close();
            }
        });
    }

  @Override
    protected void onDestroy() {
        super.onDestroy();
        //另一种加载方式的释放
        QbSdk.closeFileReader(this);
    }
//-----------------------------------------------下面是计时器的实现
    //app进入后台  暂停计时
    @Override
    protected void onStop() {
        super.onStop();
        wasRunning = running;
        running = false;
    }

    //重新进入app,开始计时
    @Override
    protected void onStart() {
        super.onStart();
        if (wasRunning) running = true;
    }

    //失去焦点(如分屏),暂停计时
    @Override
    protected void onPause() {
        super.onPause();
        wasRunning = running;
        running = false;
    }

    //获得焦点,重新开始计时
    @Override
    protected void onResume() {
        super.onResume();
        if (wasRunning) running = true;
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获取保存的状态
        if (savedInstanceState != null) {
            seconds = savedInstanceState.getInt("seconds");
            running = savedInstanceState.getBoolean("running");
            wasRunning = savedInstanceState.getBoolean("wasRunning");
        }
        runTime();
    }

    /**
     * 保存状态
     */
    @Override
    public void onSaveInstanceState(Bundle saveInstanceState) {

        super.onSaveInstanceState(saveInstanceState);
        saveInstanceState.putInt("seconds", seconds);
        saveInstanceState.putBoolean("running", running);
        saveInstanceState.putBoolean("wasRunning", wasRunning);
    }

    /**
     * 注意 ui线程不能被堵塞,因此不能在ui线程中调用sleep方法
     * 只允许ui线程更新界面,不能在后台线程更新界面
     * <p>
     * ** 使用ui线程的Handler定时更新 **
     * 将任务封装到 Runnable的run方法中 ,通过Handler的
     * post(立即提交任务)或postDelayed(实现定时调度)方法提交到ui线程
     */
    private void runTime() {
        final Handler handler = new Handler();
        handler.post(new Runnable() {
                         @Override
                         public void run() {
                          /*   int hour = seconds / 3600 % 24;
                             int minute = seconds % 3600 / 60;
                             String time = String.format("%02d:%02d:%02d", hour, minute, seconds % 60);*/
                             if (running) seconds++;
                             handler.postDelayed(this, 1000);
                         }
                     }
        );

    }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容