在WebView中打开PDF文件

6

我尝试在我的自定义WebvView中打开PDF文件已经两天了。这是我的WebView代码:

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

public class WebActivity extends AppCompatActivity {
    public
    WebView mywebViewfull;
    ProgressBar progressBar;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        String url = getIntent().getStringExtra("url");
        mywebViewfull = (WebView) findViewById(R.id.webnav1);
        progressBar=(ProgressBar)findViewById(R.id.progressbar1);
        WebSettings webSettings= mywebViewfull.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webSettings.setGeolocationEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setSaveFormData(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setLoadsImagesAutomatically(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        webSettings.setUseWideViewPort(true);
        webSettings.setBuiltInZoomControls(false);
        webSettings.setGeolocationDatabasePath(getFilesDir().getPath());
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        mywebViewfull.loadUrl(url);
        mywebViewfull.setWebViewClient(new mywebViewfullClient());


    }


    @Override
    public void onBackPressed() {
        if(mywebViewfull.canGoBack())
        {
            mywebViewfull.goBack();
        }

        else
        {
            super.onBackPressed();
        }
    }
    class mywebViewfullClient extends WebViewClient {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        progressBar.setVisibility(View.VISIBLE);
        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
       // android.support.v7.app.ActionBar actionBar = getSupportActionBar();
       // actionBar.hide();
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        progressBar.setVisibility(View.GONE);
    }
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && url.startsWith("http://")) {
            //open url contents in webview
            return false;
        }if (url != null && url.startsWith("https://")) {
                //open url contents in webview
            return false;
              //this must open pdf file
        }if (url.endsWith(".pdf")) {
            mywebViewfull.loadUrl("https://docs.google.com/gview?embedded=true&url="+getIntent().getStringExtra("url"));
            return false;

        }
        else {
            //external links in app
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;

        }
    }
}
    //back previous page
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getAction()==KeyEvent.ACTION_DOWN){
            switch (keyCode){
                case KeyEvent.KEYCODE_BACK:
                    if (mywebViewfull.canGoBack()) {
                        mywebViewfull.goBack();
                    }
                    else  {
                        finish();
                    }
                    return true;
            }
        }
        return super.onKeyDown(keyCode, event);


    }

}

所以...当我尝试打开pdf文档时,我的应用程序没有任何反应。
我不知道出了什么问题!有人能帮帮我吗?

请问,如果我的回答对您有帮助,您是否可以接受我的答案?谢谢。最好的祝愿。 - statosdotcom
3个回答

13

在Android中没有原生支持打开PDF文件的功能,但是有些解决方法可以或多或少地为您完成这项工作。以下是一些替代方案:

1 - 您可以通过从应用程序发送意图来打开系统默认应用程序以阅读pdf文件;

2 - 您可以使用第三方库在您的应用程序中打开pdf文件;

3 - 您可以调用Google Docs网站功能,在您的Web视图中打开pdf文件。要这样做,请使用以下代码示例:

String pdfUrl = "http://yourwebsite.com/yourfile.pdf";
String url = "http://docs.google.com/gview?embedded=true&url=" + pdfUrl;
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);

从您的第二点来看,您能否建议任何第三方库在应用内打开PDF? - Md. Tahmid Mozaffar
@Md.TahmidMozaffar 我使用AndroidPdfViewer(https://github.com/barteksc/AndroidPdfViewer),它的表现非常好。对于延迟我表示抱歉。祝你好运。 - statosdotcom
1
AndroidPdfViewer库加载PDF文件速度非常缓慢,有时甚至无法加载。 - Annie
@Annie "于2018年2月14日17:53回答。" 感谢您的投票支持。最好的祝福。 - statosdotcom

2
如果你想在Web视图中显示PDF,请使用以下代码:

使用以下代码:

   url = "https://docs.google.com/viewer?url=https://linkToYourPdf.pdf"

   webView.loadUrl(url);

如果你的PDF文件包含多页,请不要忘记启用垂直滚动。最初的回答中已经提到了这一点。
   webview.setVerticalScrollBarEnabled(true);

1
如果您选择Webview选项,请尝试以下操作。
WebView webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true); 
String pdf = "online pdf link";
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);

但请记住,如果您使用Google文档查看PDF或任何其他文档,Google文档可能会显示错误:

您已达到查看或下载未在Google文档格式中的文件的带宽限制... 所以似乎不太可靠。

因此,请谨慎使用Google文档查看功能。

如果您通过资产文件夹进行PDF阅读,请参考我的完整答案


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