在显示文件之前,打开PDF的意图立即关闭

时间:2016-05-16 19:03:45

标签: java android pdf android-intent

我使用以下代码打开我在工作应用模块中放置的特定文件...

private void openPDF(String filename) {

    File file = new File(Environment.getExternalStorageDirectory(), filename);
    Uri path = Uri.fromFile(file);

    Intent pdfIntent = new Intent(Intent.ACTION_VIEW);

    pdfIntent.setDataAndType(path, "application/pdf");

    try {
        startActivity(pdfIntent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(MainActivity.this, "There is no PDF file.",
                       Toast.LENGTH_SHORT).show();
    }
}

我进入try-statement并调用startActivity(...)方法。我得到一个对话框,选择我要打开文件的应用程序,但是当我选择应用程序时,Android会打开应用程序,在应用程序中显示正确的文件名,但之后会自动关闭PDF应用程序显示。

在用户决定实际“关闭”之前,如何保持PDF文件处于打开状态?

顺便说一句,我没有收到任何错误消息,也没有我能看到的警告。 PDF应用程序刚关闭。我也尝试用Google Custom Tabs打开文件,因为我已经在我的应用程序中使用了该文件,但它没有打开PDF文件(正如我预期的那样)

更新

为了实施StreamProvider,我决定为StreamProvider创建一个简单的扩展程序,该扩展程序将读取将委派工作以打开pdf-path文件的唯一标记asset

这是代码......

public class PdfProvider extends StreamProvider {

    // Special xml path tag that will work for PDFs (or any asset really)
    private static final String PDF_TAG = "pdf-path";

    @Override
    protected String getUriPrefix() { return null; }

    @Override
    protected StreamStrategy buildStrategy(Context context, String tag, String name, String path, HashMap<String, String> attrs) throws IOException {
        if (PDF_TAG.equals(tag)) {
            super.buildStrategy(context, "asset", name, path, attrs);
        }
        return super.buildStrategy(context, tag, name, path, attrs);
    }
}

另外,我对noCompress文件和路径元数据gradle进行了添加...

<paths>
    <pdf-path name="resume" path="resume/resume.pdf"/>
</paths>

我对如何实际使用PdfProvider感到困惑。文档似乎有asset逻辑作为第二个想法,StreamProvider的演示代码有点复杂的额外逻辑使得更难理解提供者方面。

1 个答案:

答案 0 :(得分:1)

  

我只是在app模块中拖放文件。不在src文件夹中。这是对的吗?

唉,不,不。这是您的开发机器上的项目。在~15亿台设备上不是external storage

如果您的长期目标是从外部存储中实际显示PDF,请将其放在设备或模拟器的外部存储设备上。使用Android Studio 2.x模拟器,您可以将PDF拖放到模拟器窗口中,但这会将其放在外部存储的assets/目录中,而不是根目录。

如果您的长期目标是显示使用您的应用打包的PDF,请将PDF放入模块的main源集app/src/main/assets/中(例如,FileProvider Android Studio项目)。然后,要么: