Android PDF ne se charge pas dans le navigateur et WebView
j'essaie de charger des fichiers PDF dans Android Webview. quand je l'ai Googlé. la meilleure réponse que j'ai trouvé est d'utiliser Google Docs. Maintenant ce que j'ai fait est d'ajouter L'URL du fichier PDF à la fin de cette url https://docs.google.com/gview?embedded=true&url=
et ensuite charger cette URL complète dans le WebView android. il charge le PDF avec succès. Mais il y a un fichier PDF sur L'URL suivante qui ne se charge pas dans WebView aussi bien que dans Chrome browser (sur mon système). L'URL PDF est
http://www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526}/externe.pdf
et quand j'essaie de charger le PDF comme https://docs.google.com/gview?embedded=true&url=www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526}/externe.pdf
alors il est dit pas de Preview disponible. est-ce que quelqu'un peut me dire ce qui ne va pas ici?
7 réponses
Ce n'est pas une réponse complète. J'ai étudié plusieurs possibilités mais je n'ai toujours pas d'explication convaincante pour ce comportement.
UNE Théorie: le codage d'URL ... n ° 151970920"
ma première pensée était la même que @gn1 - les crochets bouclés avaient besoin de encodage URL . Malheureusement, encoder le paramètre url
ne change pas le résultat.
Théorie B: Mauvais fichier PDF ... n ° 151970920"
ensuite, J'ai pensé que peut - être Google Docs ne peut pas gérer ce fichier PDF particulier-il s'agit d'une version non supportée ou utilise des fonctionnalités optionnelles ou même a des erreurs que les autres téléspectateurs tolèrent. J'ai téléchargé une copie et hébergé sur un autre site. Quand J'ai pointé Google Docs au nouvel emplacement,il prévu amende.
Théorie C: non coopératifs site ... n ° 151970920"
ensuite j'ai pensé que peut - être ce site ne coopère pas avec Google Docs pour une raison quelconque-peut-être c'est le blocage de Google à partir de l'indexation. J'ai trouvé un autre lien PDF sur le même site avec le même schéma:
quand J'ai pointé Google Docs vers ce lien, il prévoyait fine.
Théorie D: les Différentes métadonnées ... n ° 151970920"
maintenant j'en ai un un lien qui fonctionne et un qui ne fonctionne pas. Peut - être que leurs métadonnées étaient différentes-par exemple, peut-être que celui qui a fonctionné était étiqueté application/pdf et que l'autre ne l'était pas. Alors j'ai regardé les en-têtes HTTP.
URL de travail:
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
URL qui ne fonctionne pas:
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
Je ne vois aucune différence significative dans les métadonnées.
Théorie E: demande étrange de Google ... n ° 151970920"
je suis certes, à saisir les pailles à ce point. Je me suis demandé si la requête de Google était différente d'une manière ou d'une autre - peut-être qu'elle demandait une plage de octets ou une compression obscure ou quelque chose, et le serveur cible ne l'a pas traitée de manière cohérente. J'ai donc pointé Google Docs sur un site que je contrôle pour voir à quoi ressemble la requête 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)
ce n'est pas bizarre du tout. J'ai vérifié que le site cible ignore les requêtes de compression, donc ce n'est pas un cas de compression buggée. J'ai aussi j'ai essayé d'accéder au site cible avec cet en-tête User-Agent et ça n'a pas semblé avoir d'importance.
" donc j'ai trouvé des indices qui nous aident à nous dire ce qui n'est pas le problème mais rien qui explique ce qui est. Je vais l'afficher dans l'espoir que ces résultats négatifs seront utiles à quelqu'un.
j'utilise ceci et travaille pour moi: 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);
}
}
vérifiez le code exemple pour ouvrir PDF sans téléchargement, dans webview .
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;
}
}
par l'apparence des choses L'URL que vous pointez inclut des références d'emplacement spécifiques à l'appareil.
vous pouvez regarder le téléchargement du fichier à la boutique interne, puis en utilisant une intention de charger le PDF avec n'importe quelle application installée.
à Partir de Comment ouvrir un PDF via Intention de carte 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);
alternativement vous pouvez instancier le fichier avec l'url web
j'ai mis le fichier sur mon serveur et ça fonctionne très bien. Il s'agit d'un problème Google Docs rencontré dans L'URL ou les robots.txt. Le document est très bien. Vous pouvez utiliser URL rewrite pour faire Google Docs être dupé en pensant qu'il est à partir d'un autre dossier. Ces personnages bizarres dans le chemin pourraient être le problème.
Téléchargez le code source ici ( Open pdf dans 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>
activité principale.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();
}
});
}
}
Voici la solution de travail pour 'no Preview Available' issue.. Le problème Exact est dans l'encodage URL que nous concatons avec " "http://docs.google.com/gview?url= ". Cela signifie que nous devons remplacer tous les caractères spéciaux (:,/, & etc) de l'url par unicode. URI.encode("") faire l'affaire pour nous.
String url = Uri.encode("your link");
String finalUrl = "http://docs.google.com/viewer?url=" + url + "&embedded=true";
WebSettings webSettings = webView.getSettings();
webSettings.setBuiltInZoomControls(true);
webSettings.setJavaScriptEnabled(true);
webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
progressView.setVisibility(View.VISIBLE);
webView.loadUrl(finalUrl);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
view.getSettings().setLoadsImagesAutomatically(true);
webView.setVisibility(View.VISIBLE);
//progressView.setVisibility(View.VISIBLE);
if (progressView != null && progressView.isShown()) {
progressView.setVisibility(View.GONE);
}
Log.v("after load", view.getUrl());
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(getApplicationContext(), description, Toast.LENGTH_SHORT).show();
Log.e("error", description);
}
});