No se carga el PDF de Android en el navegador y en WebView

Estoy tratando de cargar archivos PDF en Android Webview. Cuando lo busqué en Google. La mejor respuesta que encontré es usar Google Docs. Ahora lo que hice fue añadir la URL del archivo PDF al final de esta url https://docs.google.com/gview?embedded=true&url=

Y luego cargar esta URL completa en el androide WebView. Carga el PDF con éxito. Pero hay un archivo PDF en la siguiente URL que no se carga en WebView, así como en el navegador Chrome (en mi sistema). La URL de PDF es

Http://www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605} / {05c36123-4df0-4d7d-811c-8b6686fdd526} /external.pdf

Y Cuando intento cargar el PDF como https://docs.google.com/gview?embedded=true&url=www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605} / { 05c36123-4df0-4d7d-811c-8b6686fdd526} /external.pdf

Entonces dice No hay vista previa disponible. Puede cualquier persona por favor decirme cuál es incorrecto Aquí.

Esta no es una respuesta completa. Investigué varias posibilidades pero aún no tengo una explicación convincente para este comportamiento.

Teoría A: codificación de URL … no

Mi primer pensamiento fue el mismo que @ gn1 – los corchetes necesitaban codificación URL . Desafortunadamente, la codificación del parámetro url no cambia el resultado.

Teoría B: archivo PDF incorrecto … no

A continuación, pensé que tal vez Google Docs no puede manejar este archivo PDF en particular – es una versión no compatible o utiliza características opcionales o incluso tiene errores que toleran otros espectadores. Descargé una copia y la recibí en otro sitio. Cuando señalé a Google Docs a la nueva ubicación, se visualizó bien.

Teoría C: Sitio no cooperativo … no

Después pensé que tal vez este sitio no coopera con Google Docs por alguna razón – tal vez está bloqueando Google de la indexación. Encontré otro enlace PDF en el mismo sitio con el mismo esquema:

Http: // www.

Cuando apunté a Google Docs a este enlace, se visualizó bien.

Teoría D: Diferentes metadatos … no

Ahora tenía un enlace que funcionaba y otro que no funcionaba. Tal vez sus metadatos eran diferentes – por ejemplo, quizás el que trabajó fue etiquetado application / pdf y el otro no. Así que miré los encabezados HTTP.

URL de trabajo:

 HTTP/1.1 200 OK Cache-Control: max-age=3600 Content-Length: 1767120 Content-Type: application/pdf Last-Modified: Fri, 02 Nov 2007 12:45:00 GMT Accept-Ranges: bytes ETag: "46b1592e4e1dc81:13e6" Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Date: Wed, 03 Jun 2015 23:25:23 GMT 

No funciona URL:

 HTTP/1.1 200 OK Cache-Control: max-age=3600 Content-Length: 4623702 Content-Type: application/pdf Last-Modified: Mon, 11 May 2015 15:53:16 GMT Accept-Ranges: bytes ETag: "acac5d9828cd01:13e6" Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Date: Wed, 03 Jun 2015 23:25:42 GMT 

No veo diferencias aparentes significativas en los metadatos.

Teoría E: Solicitud extraña de Google … no

Estoy admitiendo agarrar en pajitas en este punto. Me preguntaba si la solicitud de Google era diferente de alguna manera – tal vez pidió un rango de bytes o compresión oscura o algo así, y el servidor de destino no manejar consistentemente bien. Así que señalé a Google Docs en un sitio que controlé para ver cómo era la solicitud HTTP:

 GET /asp/in4glestates/%7B16D968D6-198E-4E33-88F4-8A85731CE605%7D/%7B05c36123-4df0-4d7d-811c-8b6686fdd526%7D/External.pdf HTTP/1.1 Host: www.example.com:55555 Connection: Keep-alive Accept-Encoding: gzip,deflate User-Agent: Mozilla/5.0 (compatible; Google AppsViewer; http://drive.google.com) 

Eso no es raro en absoluto. Hice verificar que el sitio de destino ignora las solicitudes de compresión por lo que no es un caso de compresión de buggy. También traté de acceder al sitio de destino con ese encabezado User-Agent y no parecía importar.


Así que he encontrado pistas que ayudan a decirnos lo que no es el problema, pero nada aún que explica lo que es. Estoy publicando con la esperanza de que estos resultados negativos seguirán siendo útiles para alguien.

Estoy usando esto y funciona para mí: http://weimenglee.blogspot.com/2013/05/android-tip-displaying-pdf-document.html

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebView webView=new WebView(MainActivity.this); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setPluginState(WebSettings.PluginState.ON); //---you need this to prevent the webview from // launching another browser when a url // redirection occurs--- webView.setWebViewClient(new Callback()); String pdfURL = "http://www.expertagent.co.uk/asp/in4glestates/{16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526}/external.pdf"; webView.loadUrl( "http://docs.google.com/gview?embedded=true&url=" + pdfURL); setContentView(webView); } private class Callback extends WebViewClient { @Override public boolean shouldOverrideUrlLoading( WebView view, String url) { return(false); } } 

Compruebe el código de ejemplo para abrir PDF sin descargar, en la vista web .

 private void init() { WebView webview = (WebView) findViewById(R.id.webview); WebSettings settings = webview.getSettings(); settings.setJavaScriptEnabled(true); webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); PdfWebViewClient pdfWebViewClient = new PdfWebViewClient(this, webview); pdfWebViewClient.loadPdfUrl( "https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjgwIfp3KXSAhXrhFQKHQqEDHYQFggZMAA&url=http%3A%2F%2Fwww.orimi.com%2Fpdf-test.pdf&usg=AFQjCNERYYcSfMLS5ukBcT2Qy11YxEhXqw&cad=rja"); } private class PdfWebViewClient extends WebViewClient { private static final String TAG = "PdfWebViewClient"; private static final String PDF_EXTENSION = ".pdf"; private static final String PDF_VIEWER_URL = "http://docs.google.com/gview?embedded=true&url="; private Context mContext; private WebView mWebView; private ProgressDialog mProgressDialog; private boolean isLoadingPdfUrl; public PdfWebViewClient(Context context, WebView webView) { mContext = context; mWebView = webView; mWebView.setWebViewClient(this); } public void loadPdfUrl(String url) { mWebView.stopLoading(); if (!TextUtils.isEmpty(url)) { isLoadingPdfUrl = isPdfUrl(url); if (isLoadingPdfUrl) { mWebView.clearHistory(); } showProgressDialog(); } mWebView.loadUrl(url); } @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { return shouldOverrideUrlLoading(url); } @SuppressWarnings("deprecation") @Override public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) { handleError(errorCode, description.toString(), failingUrl); } @TargetApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request) { final Uri uri = request.getUrl(); return shouldOverrideUrlLoading(webView, uri.toString()); } @TargetApi(Build.VERSION_CODES.N) @Override public void onReceivedError(final WebView webView, final WebResourceRequest request, final WebResourceError error) { final Uri uri = request.getUrl(); handleError(error.getErrorCode(), error.getDescription().toString(), uri.toString()); } @Override public void onPageFinished(final WebView view, final String url) { Log.i(TAG, "Finished loading. URL : " + url); dismissProgressDialog(); } private boolean shouldOverrideUrlLoading(final String url) { Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url); if (!isLoadingPdfUrl && isPdfUrl(url)) { mWebView.stopLoading(); final String pdfUrl = PDF_VIEWER_URL + url; new Handler().postDelayed(new Runnable() { @Override public void run() { loadPdfUrl(pdfUrl); } }, 300); return true; } return false; // Load url in the webView itself } private void handleError(final int errorCode, final String description, final String failingUrl) { Log.e(TAG, "Error : " + errorCode + ", " + description + " URL : " + failingUrl); } private void showProgressDialog() { dismissProgressDialog(); mProgressDialog = ProgressDialog.show(mContext, "", "Loading..."); } private void dismissProgressDialog() { if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); mProgressDialog = null; } } private boolean isPdfUrl(String url) { if (!TextUtils.isEmpty(url)) { url = url.trim(); int lastIndex = url.toLowerCase().lastIndexOf(PDF_EXTENSION); if (lastIndex != -1) { return url.substring(lastIndex).equalsIgnoreCase(PDF_EXTENSION); } } return false; } } 

Por las miradas de las cosas, la URL a la que apunta incluye algunas referencias de ubicación específicas del dispositivo.

Podría ver descargar el archivo en un almacén interno y luego usar la intención de cargar el PDF con cualquier aplicación instalada.

Cómo abrir un PDF a través de Intent de la tarjeta SD

 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); 

Alternativamente, podría instanciar el archivo con el url web

Pongo el archivo en mi servidor y funciona bien. Este es un problema de Google Docs encontrado en la URL o en el archivo robots.txt. El documento está bien. Puedes usar la reescritura de URL para hacer que Google Docs se deje engañar pensando que es de otra carpeta. Esos personajes extraños en el camino podrían ser el problema.

Doc carga bien

Descargar el código fuente desde aquí ( Abrir pdf en webview android );

Activity_main.xml

 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <WebView android:layout_width="match_parent" android:background="#ffffff" android:layout_height="match_parent" android:id="@+id/webview"></WebView> </RelativeLayout> 

MainActivity.java

 package com.pdfwebview; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { WebView webview; ProgressDialog pDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); listener(); } private void init() { webview = (WebView) findViewById(R.id.webview); webview.getSettings().setJavaScriptEnabled(true); pDialog = new ProgressDialog(MainActivity.this); pDialog.setTitle("PDF"); pDialog.setMessage("Loading..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); webview.loadUrl("https://drive.google.com/file/d/0B534aayZ5j7Yc3RhcnRlcl9maWxl/view"); } private void listener() { webview.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); pDialog.show(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); pDialog.dismiss(); } }); } } 
  • Android - Cómo ejecutar la intención de JavaScript
  • WebView height = wrap_content con cambiar el tamaño de fuente no funciona
  • Vista web de Android dentro de un servicio?
  • WebView en un cuadro de diálogo (carga de activos) y no presentado
  • Android: Callbacks con componente WebView?
  • Vista web de Android POST
  • ¿Cómo crear PDF desde webview en android?
  • Android WebView canGoBack siempre es cierto
  • Cómo cambiar el tamaño de una vista web de Android después de agregar datos en ella
  • Hacer que el inicio de sesión en facebook funcione con una vista Web de Android
  • Mostrar archivo PDF en Android WebView utilizando mozilla pdf.js Nivel de API Android inferior a 19
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.