2012-02-04 2 views
5

Ho sviluppato un'applicazione web che mostra un elenco di documenti pdf ospitati su un server web. Questa app è incorporata in un'applicazione webview per Android, tuttavia quando carico l'app sul mio telefono, la selezione di un link pdf non fa nulla. Che cosa sto facendo di sbagliato? Graziewebview non carica i file pdf sul link clicca

Heres il codice 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); 
} 
} 

risposta

12

Se si desidera caricare pdf è possibile utilizzare Google Docs per caricarlo.

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: È necessario android.permission.INTERNET nel file manifesto

+2

preferirei non usare per lo spettatore GoogleDocs, invece di caricare il PDF in un visualizzatore PDF o un PDF può far scritto nel codice attività – Chris

+1

questa è una grande soluzione se poi non vorrai per estrai l'utente dalla tua app per visualizzare il PDF –

0

uso loadURL altri metodi di overload ... e scrittura internet

6

Basta creare un Intent nel metodo 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; 
    } 

E quindi ogni volta che un utente fa clic su un collegamento PDF in una pagina all'interno della tua webview, il file si aprirà in un'applicazione PDF esterna.

+1

Works for me !. Per "urlIsPDF" ho usato: url.endsWith (". Pdf") – Alex

+0

Basta controllare il gestore degli imballaggi se l'intento è disponibile prima di provare ad aprirlo –

3

Questa è la soluzione che uso:

@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

Devi eseguire l'override shouldOverrideUrlLoading metodo WebClient. Io uso questo approccio con la combinazione di intenti e di Google Documenti come 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; 
    } 
}); 

Potrebbe essere necessario cambiare passando il contesto e l'accesso startActivity metodo, ma diverso da quello che dovrebbe funzionare così com'è.

Si noti inoltre che dal momento che l'API 24, ci sono 2 metodi shouldOverrideUrlLoading che è possibile sovrascrivere. Come indicato in here da @CommonsWare, è possibile eseguire l'override del metodo deprecato.

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

questo sicuramente aiuterà tutti voi, ho controllato il 28 nov 2017, funziona –

+0

grazie-funziona per me !. Per "urlIsPDF" ho usato: url.endsWith (". Pdf") - Alex –