2017-04-27 103 views
0

當前製作WebView HTML應用程序和我到本地PDF文件的鏈接(路徑是相對的)不起作用。我只是希望它在外部應用程序中打開(不在WebView中)。我從本網站嘗試了多個PDF意圖,但沒有成功。從Android Studio在外部應用程序中打開本地PDF HTML文檔

我本來的Overridepublic Boolean launchPDF以上,但一直得到

:method does not override or implement method from a supertype 

我需要這是對所有PDF毯子聲明,因爲我有很多。

的AndroidManifest.xml:

import android.content.ActivityNotFoundException; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 

public class MainActivity extends AppCompatActivity { 

    private WebView myWebView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     myWebView = (WebView) findViewById(R.id.webView); 
     WebSettings webSettings = myWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setDomStorageEnabled(true); 
     myWebView.loadUrl("file:///android_asset/index.html"); 
    } 

    public boolean launchPDF(WebView view, String url) { 
     if (urlIsPDF(url)) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.parse(url), "application/pdf"); 
      try { 
       view.getContext().startActivity(intent); 
      } catch (ActivityNotFoundException e) { 
       //User does not have pdf viewer installed 
      } 
     } else { 
      myWebView.loadUrl(url); 
     } 
     return true; 
    } 

    public boolean urlIsPDF(String url) { 
     return url.endsWith(".pdf"); 
    } 
}; 
+0

「我的本地PDF文件的鏈接」 - 這是什麼意思?你的HTML來自'assets /'。如果您的PDF文件也在'assets /'中,您將無法按照您嘗試的方式查看它們。 – CommonsWare

+0

我有一個文件夾結構將PDF文件堆在資產文件夾(它複製我的Web服務器)。我需要它離線,因爲這將主要被停用。我怎麼能讓他們在當地工作呢? –

+0

只是因爲我使用相同的文件來訪問服務器上的文件夾中的這些文件。我可以手動將它們放在設備上的文件夾,然後一些如何將任何pdf(* .pdf)的鏈接重定向到文件夾(例如下載或AppPdfs –

回答

0

一種選擇是使用my StreamProvider才能夠從您的應用assets/服務PDF文件,直接。這不是很難設置,並且不需要您在運行時複製任何數據。您可以在您的ACTION_VIEWIntent中使用StreamProvider供電Uri。但是,這並不適用於所有PDF查看器,特別是不是Google Drive應用程序的一部分,只有在他們修正了錯誤之後才能使用。

如果您想要更高的兼容性,請將資產複製到本地文件系統上的文件(例如,getCacheDir()),然後使用Android支持庫中的FileProvider。除了必須進行復制之外,這與使用StreamProvider具有相同的基本效果。從文件服務,而不是直接來自in-APK資產,提高了與PDF觀看者的兼容性,儘管有些人可能仍然因打開contentUri值時出現問題而打嗝。

還有一種選擇是在應用程序中嵌入某種PDF查看功能。在this blog post中,我概述了三個選項。它們都在兼容性和尺寸方面進行權衡,沒有一個像獨立的PDF閱讀器那樣功能全面。

或者,您可以找到一些工具將您的PDF轉換爲HTML/CSS /圖像,將這些內容打包到您的應用中,並在WebView中顯示這​​些內容。

+0

好吧,有沒有什麼機會可以給我一個如何插入StreamProvider?看起來這對我來說是最好的選擇,這些文件最好保存在應用程序的某個地方,因爲我不希望用戶能夠刪除它們。 –

+0

@MitchellDay:「我不想要用戶能夠刪除它們「 - 呃,用戶不能從你的應用的Android SDK引用的部分中刪除它們[內部存儲器](https://commonsware.com/blog/2014/04/07/ storage-situation-internal-storage.html),即使用戶清除了數據,你也可以轉過身來再次從資產中複製它們。關於StreamProvider,除了CWAC-Provider回購中的演示項目之外,我在書中的一些例子中使用它,比如[this](https://github.com/commonsguy/cw-omnibus/tree/v8.5) /的DragDrop /分屏/應用/ src目錄/主/資產)。 – CommonsWare

+0

好吧,那麼我如何存儲他們的數據呢?我是否將它放在資產文件夾中,然後在安裝時複製它?還有一種方法可以製作一個用於打開PDF文件的一攬子聲明?我注意到,他們似乎都定義了PDF而不是一般的pdf文件。再次抱歉,這是非常新的,我主要是網站開發。 –

相關問題