2012-02-04 25 views
5

He desarrollado una aplicación web que muestra una lista de documentos pdf alojados en un servidor web. Esta aplicación está incorporada en una aplicación de vista web para Android. Sin embargo, cuando cargo la aplicación en mi teléfono, la selección de un enlace en pdf no hace nada. ¿Qué estoy haciendo mal? Graciaswebview no cargará archivos PDF en el enlace haga clic en

Heres el código 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); 
} 
} 

Respuesta

12

Si desea cargar pdf se puede utilizar Google Docs para cargarlo.

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

webView.loadUrl(googleDocs + pdf_url); 

NOTA: Es necesario android.permission.INTERNET en el archivo de manifiesto

+2

yo preferiría no usar el visor de Google Docs, en lugar de cargar el PDF en un visor de PDF instalado o un PDF renderizar escrito en el código de actividad – Chris

+1

Esta es una gran solución si no wan't sacar al usuario de su aplicación para ver el PDF –

0

uso LoadURL otros métodos sobrecargados ... y escribir permisos de Internet

6

Hay que crear una intención en su método shouldOverrideUrlLoading:

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

Y cada vez que un usuario hace clic en un enlace PDF en una página dentro de su vista web, el archivo se abrirá en una aplicación PDF externa.

+1

¡Funciona para mí !. Para "urlIsPDF" utilicé: url.endsWith (". Pdf") – Alex

+0

Simplemente verifique el administrador de empaquetado si el intento está disponible antes de intentar abrirlo –

3

Esta es la solución que utilizo:

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

con

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

Tiene que reemplazar shouldOverrideUrlLoading método en el cliente Web. Yo uso este enfoque con la combinación de intención y Google Docs como una copia de seguridad:

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

Es posible que tenga que cambiar de pasar el contexto y el acceso a startActivity método, pero aparte de eso debería funcionar tal como es.

También tenga en cuenta que desde la API 24, hay 2 métodos shouldOverrideUrlLoading que puede anular. Como se establece here de @CommonsWare, está bien anular el método en desuso.

2
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; 
    } 
} 
+0

esto definitivamente ayudará a todos ustedes, lo revisé el 28 de noviembre de 2017, está funcionando –

+0

gracias-¡Trabajo para mi !. Para "urlIsPDF" utilicé: url.endsWith (". Pdf") - Alex –

Cuestiones relacionadas