2017-04-27 166 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文件。再次抱歉,这是非常新的,我主要是网站开发。 –

相关问题