11

I have developed a web app that displays a list of pdf documents hosted on a web server. This app is embedded in a webview app for android however when I load the app on my phone, selection of a pdf link does nothing. What am I doing wrong? Thanks

Heres the java code:

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);
}
}
Chris
  • 159
  • 1
  • 1
  • 5

7 Answers7

17

If you want to load pdf you can use Google docs to load it.

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

webView.loadUrl(googleDocs + pdf_url);

NOTE: You need android.permission.INTERNET in Manifest file

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
Lalit Poptani
  • 67,150
  • 23
  • 161
  • 242
  • 4
    I would prefer to not use the googleDocs viewer, instead to load the PDF in an installed PDF viewer or a PDF render written into the activity code – Chris Feb 25 '12 at 08:49
  • 2
    this is a great solution if you don't wan't to bump the user out of your app to view the PDF – Matt Baker Oct 30 '15 at 15:13
  • Great solution, seems that viewing pdf through webView is not possible with just the base url. Thanks. – Lucas Gras Jan 27 '20 at 14:00
  • This works only if pdf file size is small size otherwise this will not work. Not worked for me in case of 432 KB size pdf file. Thanks – Kamlesh Sep 09 '21 at 13:50
14

Just create an Intent in your shouldOverrideUrlLoading method:

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

And then whenever a user clicks a PDF link in a page within your webview, the file will open in an external PDF app.

Chicowitz
  • 5,759
  • 5
  • 32
  • 38
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;
    }
}
Anh Pham
  • 2,108
  • 9
  • 18
  • 29
5

This is the solution I use:

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

with

private final String googleDocs = "https://docs.google.com/viewer?url=";
bustazone
  • 67
  • 1
  • 1
5

You have to override shouldOverrideUrlLoading method in WebClient. I use this approach with combination of intent and Google Docs as a backup:

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

You might need to change passing the context and accessing startActivity method, but other than that it should run as it is.

Also note that since API 24, there are 2 shouldOverrideUrlLoading methods you can override. As it is stated here from @CommonsWare, it is OK to override deprecated method.

arenaq
  • 2,304
  • 2
  • 24
  • 31
0

Sharing this answer as I tried all the above solutions but did not work for me, this is Kotlin code (not 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
        }
    })
TheTechGuy
  • 16,560
  • 16
  • 115
  • 136
0

use loadurl another overloaded methods...and write internet permission

arpit
  • 555
  • 1
  • 7
  • 25