点击链接时,Webview无法加载PDF文件。

11
我开发了一个Web应用程序,显示托管在Web服务器上的PDF文档列表。该应用程序嵌入在Android Webview应用程序中,但是当我在手机上加载该应用程序并选择PDF链接时,什么也没有发生。我做错了什么?谢谢
这是Java代码:
package com.hellowebview;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class HellowebviewActivity extends Activity {
/** Called when the activity is first created. */

private WebView mWebView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.loadUrl("http://aipnz.webs.com");
    mWebView.setWebViewClient(new HelloWebViewClient());
    mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

}
private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView webview, String url)
    {
        webview.loadUrl(url);
        return true;
    }
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
    {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
}
7个回答

17

如果您想加载PDF,可以使用Google文档来加载它。

String googleDocs = "https://docs.google.com/viewer?url=";
String pdf_url = "http://kronox.org/documentacion/Hello.Android.new.pdf";  

webView.loadUrl(googleDocs + pdf_url);

注意:在清单文件中需要添加android.permission.INTERNET权限


4
我会尽力为您翻译:“我更喜欢不使用Google文档查看器,而是将PDF加载到已安装的PDF查看器或嵌入活动代码中的PDF渲染器中。” - Chris
2
如果您不想将用户弹出应用程序以查看PDF,则这是一个很好的解决方案。 - Matt Baker
很棒的解决方案,似乎仅通过基本URL无法通过webView查看PDF。谢谢。 - Lucas Gras
这仅适用于PDF文件大小较小的情况,否则将无法正常工作。在432 KB大小的PDF文件中未能正常工作。谢谢。 - Kamlesh

14

只需在 shouldOverrideUrlLoading 方法中创建一个 Intent:

    @Override
    public boolean shouldOverrideUrlLoading(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 a pdf viewer installed
            }
        } else {
            webview.loadUrl(url);
        }
        return true;
    }

然后,当用户在您的webview页面中点击PDF链接时,文件将在外部PDF应用程序中打开。


1
对我来说没问题!对于"urlIsPDF",我使用了:url.endsWith(".pdf")。 - Alex
在尝试打开包管理器之前,只需检查意图是否可用即可。 - Ashish John

7
webView.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".pdf")) {
            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 a pdf viewer installed
            }
        } else {
            webView.loadUrl(url);
        }

        return true;
    }
}

这肯定会对你们所有人有所帮助,我在2017年11月28日检查过了,它是有效的。 - Md Saddamul Haque
谢谢 - 对我有用!对于"urlIsPDF",我使用了:url.endsWith(".pdf") - Alex - Md Saddamul Haque

5

您需要在WebClient中重写shouldOverrideUrlLoading方法。我使用这种方法结合意图和Google文档作为备份:

/* You might want to move this string definition somewhere else */
final String googleDocs = "https://docs.google.com/viewer?url=";

WebView webView = new WebView(getContext());
//webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView webView, String url) {
        if (url.endsWith(".pdf")) {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), "application/pdf");
            /* Check if there is any application capable to process PDF file. */
            if (intent.resolveActivity(getPackageManager()) != null) {
                startActivity(intent);
            } else {
                /* If not, show PDF in Google Docs instead. */
                view.loadUrl(googleDocs + url);
            }
        } else {
            webView.loadUrl(url);
        }
        return true;
    }
});

您可能需要更改传递的上下文和访问startActivity方法,但除此之外,它应该按原样运行。

此外,请注意,自API 24以来,有两个可以重写的shouldOverrideUrlLoading方法。正如@CommonsWare在这里所述,覆盖弃用的方法是可接受的。


太棒了!谢谢你提供这个好的解决方案! - Charles Tempo

5
这是我使用的解决方案:
@Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".pdf")){
            String pdfUrl = googleDocs + url;
            view.loadUrl(pdfUrl);
        } else {
            view.loadUrl(url);
        }
        return true;
    }

使用

private final String googleDocs = "https://docs.google.com/viewer?url=";

不错的解决方案...帮了我很多 - BharathRao

0

使用loadUrl的其他重载方法...并写入Internet权限


0

分享这个答案,因为我尝试了所有上面的解决方案,但对我没有用,这是Kotlin代码(不是JavaScript)

    myWebView.setWebViewClient(object:WebViewClient() {
       override fun shouldOverrideUrlLoading(view:WebView, url:String):Boolean {
            if (url.endsWith(".pdf"))
            {
                val intent = Intent(Intent.ACTION_VIEW)
                intent.setDataAndType(android.net.Uri.parse(url), "application/pdf")
                try
                {
                    view.getContext().startActivity(intent)
                }
                catch (e:ActivityNotFoundException) {
                    //user does not have a pdf viewer installed
                }
            }
            else
            {
                myWebView.loadUrl(url)
            }
            return true
        }
    })

你好,如果PDF链接不包含.pdf扩展名怎么办,例如https://foulabook.com/book/downloading/401212926? - mohammad alabid
如果链接不是PDF格式,你想对它做什么? - TheTechGuy
以上链接是指向直接PDF文件的链接。 - mohammad alabid
你需要根据数据/文件的格式创建自定义处理程序。 - TheTechGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接