如何在Android应用中显示动态生成的PDF

时间:2017-07-10 18:23:37

标签: android pdf android-intent

在我的情况下,在活动A中,当点击按钮A时,它应该打开一个pdf文件。我无法将pdf放在我们的服务器中并使用以下内容加载它:https://docs.google.com/viewer?url=https://www.mysite.ca/.../file.pdf。原因是:1)这个pdf文件是动态生成的; 2)此pdf的路径受到保护。

所以我试过这个:1)首先将动态生成的内容(从Web服务中检索)保存在手机文件中; 2)在活动A中单击按钮A时,将已保存文件加载到活动B中。 的编辑:

在活动A中:

mBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AppUtils.preparePdfInPhoneAndStartActivity(this, serviceUrl, inputsMap);// the last 2 params are the web service url and inputs
                }
            });

在preparePdfInPhoneAndStartActivity()中:

{
...
//== decode the fileContent string - fileContent is a encoded byte string containing the pdf content
    byte[] decodedFileContent = Base64.decode(fileContent, Base64.DEFAULT);

    String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath();
    fileNameInPhone = dir+"/"+fileNameInPhone;//fileName is the pdf file name, here contacted as the full path, it has this value: /storage/emulated/0/Download/file.pdf
    OutputStream out = new FileOutputStream(fileNameInPhone);
    out.write(decodedFileContent);
    out.close();
    File file = new File(fileNameInPhone);
    Uri path = Uri.fromFile(file);
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(path, "application/pdf");
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    activity.startActivity(intent);// activity is a instance of Activity A.
}

pdf在第二个活动中打开(使用Intent.ACTION_VIEW)。但是"返回"活动A结束按钮冻结(不可点击)。活动A中的其他按钮仍然有效。

调试时注意到的一些事情: 1)保存的pdf文件的路径为: /storage/emulated/0/Download/file.pdf 。但我无法在这个位置的手机中找到这个文件:Computer \ Galaxy s3(964)\ Phone \ Download。拔下手机并将其再次插入我的电脑后,此文件显示。 2)注销应用程序并再次登录,"按钮A"可以再次点击。

由于2)观察,我尝试在启动第二个活动后添加此行:

activity.finish();

这修复了冻结的按钮A,但是当从第二个活动进行备份时,它不会回到活动A中的最后一个屏幕/片段,但隐藏在后台的应用程序并将其启动将登陆第一个屏幕/片段活动A.我想这是因为" activity.finish();"

3)没有添加" activity.finish();",当支持活动A,按钮A冻结,点击另一个菜单并选择启动pdf文件的菜单时,它仍然打开pdf在第二个活动中,但同样,菜单不可点击。根据这一观察,Intent.ACTION_VIEW的第二项活动似乎与手机中的文件无法正常工作?

所以我的问题:1)是否有更好的方法在Android应用中显示动态生成的pdf内容而不会导致这种冻结行为? 2)如果" activity.finish();"必须在Intent.ACTION_VIEW启动第二个活动后添加,如何恢复/保持活动A的状态。

提前致谢! 肖恩

0 个答案:

没有答案