簡體   English   中英

在顯示文件之前立即關閉意圖打開 PDF

[英]Intent to open PDF instantly closes before showing the file

我正在使用以下代碼打開放置在我的工作應用程序模塊中的特定文件...

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);
    }
}

另外,我的gradle文件和路徑元數據中添加了noCompress ...

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

我對如何實際使用PdfProvider感到困惑。 該文檔似乎將asset邏輯作為第二個想法, StreamProvider的演示代碼與附加邏輯有點復雜,這使得理解提供者方面變得更加困難。

我只是將文件拖放到應用程序模塊中。 不在 src 文件夾中。 甚至這樣嗎?

唉,沒有。 那是您在開發機器上的項目。 它不是大約 15 億設備上的外部存儲

如果您的長期目標是從外部存儲實際顯示 PDF,請將其放在設備或模擬器的外部存儲上。 使用 Android Studio 2.x 模擬器,您可以將 PDF 拖放到模擬器窗口中,但這會將它放在外部存儲的Downloads/目錄中,而不是根目錄中。

如果您的長期目標是顯示與應用程序一起打包的 PDF,請將 PDF 放在模塊main assets/中(例如,典型 Android Studio 項目中的app/src/main/assets/ )。 然后,要么:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM