Ich versuche, PDF -Dateien in Android Webview zu laden. wenn ich es gegoogelt habe Die beste Antwort, die ich gefunden habe, ist Google Text & Tabellen. Jetzt füge ich die PDF -Datei-URL am Ende dieser URL an https://docs.google.com/gview?embedded=true&url=
und laden Sie dann diese vollständige URL in die Android-WebView. Es lädt die PDF erfolgreich. Es gibt jedoch eine PDF -Datei unter der folgenden URL, die sowohl in WebView als auch im Chrome-Browser (auf meinem System) nicht geladen wird. Die URL PDF lautet
http://www.expertagent.de/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526} /external.pdf
und wenn ich versuche, das PDF als https://docs.google.com/gview?embedded=true&url=www.expertagent.co.uk/asp/in4glestates/ {16D968D6 zu laden -198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526} /external.pdf
dann heißt es Keine Vorschau verfügbar. Kann mir bitte jemand sagen, was hier falsch ist.
Dies ist keine vollständige Antwort. Ich habe verschiedene Möglichkeiten untersucht, aber immer noch keine überzeugende Erklärung für dieses Verhalten.
Mein erster Gedanke war der gleiche wie @ gn1 - die geschweiften Klammern werden benötigt RL-Kodierung . Leider ändert die Kodierung des Parameters url
nichts am Ergebnis.
Als nächstes dachte ich, dass Google Text & Tabellen diese bestimmte PDF Datei nicht verarbeiten kann - es ist eine nicht unterstützte Version oder verwendet optionale Funktionen oder weist sogar Fehler auf, die andere Betrachter tolerieren. Ich habe eine Kopie heruntergeladen und auf gehostet Eine andere Website. Wenn ich Google Text & Tabellen auf den neuen Speicherort verweise, wird eine Vorschau angezeigt.
Als nächstes dachte ich, dass diese Website möglicherweise aus irgendeinem Grund nicht mit Google Text & Tabellen zusammenarbeitet. Vielleicht hindert sie Google daran, sie zu indizieren. Ich habe einen anderen PDF Link auf derselben Site mit demselben Schema gefunden:
Wenn ich Google Text & Tabellen auf diesen Link verweise, wird eine Vorschau angezeigt.
Jetzt hatte ich einen Link, der funktionierte und einen, der nicht funktionierte. Vielleicht waren ihre Metadaten anders - z. Vielleicht war der eine, der funktionierte, mit application/pdf markiert und der andere nicht. Also habe ich mir die HTTP-Header angesehen.
Arbeits-URL:
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
Nicht funktionierende 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
Ich sehe keine offensichtlichen signifikanten Unterschiede bei den Metadaten.
Ich greife zu diesem Zeitpunkt zugegebenermaßen nach Strohhalmen. Ich fragte mich, ob die Anfrage von Google irgendwie anders war - möglicherweise wurde ein Byte-Bereich oder eine undurchsichtige Komprimierung oder etwas anderes angefordert, und der Zielserver handhabte dies nicht durchgehend gut. Deshalb habe ich Google Text & Tabellen auf eine von mir gesteuerte Site verwiesen, um zu sehen, wie die HTTP-Anforderung aussah:
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)
Das ist überhaupt nicht komisch. Ich habe überprüft, ob die Zielsite Komprimierungsanforderungen ignoriert, damit keine fehlerhafte Komprimierung auftritt. Ich habe auch versucht, mit diesem User-Agent-Header auf die Zielwebsite zuzugreifen, und es schien keine Rolle zu spielen.
Ich habe also Hinweise gefunden, die uns helfen, das Problem zu erkennen, aber noch nichts, was das Problem erklärt. Ich poste in der Hoffnung, dass diese negativen Ergebnisse weiterhin für jemanden von Nutzen sind.
Ich verwende das und arbeite für mich: 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);
}
}
Den Beispielcode für das Öffnen von PDF ohne Download in Webview .__ auschecken. .
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;
}
}
Wie es aussieht, enthält die URL, auf die Sie zeigen, einige gerätespezifische Standortreferenzen.
Sie können die Datei in den internen Speicher herunterladen und dann mit einer bestimmten Absicht die PDF mit einer installierten App laden.
Von So öffnen Sie eine PDF über Intent von der SD-Karte
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);
Alternativ können Sie die Datei mit der Web-URL instanziieren
Ich lege die Datei auf meinen Server und es funktioniert gut. Dies ist ein Google Text & Tabellen-Problem, das in der URL oder in der Datei robots.txt aufgetreten ist. Das Dokument ist in Ordnung. Sie können die URL-Umschreibung verwenden, um Google Docs dazu zu bringen, zu glauben, dass es aus einem anderen Ordner stammt. Diese seltsamen Zeichen im Pfad könnten das Problem sein.
Laden Sie den Quellcode von hier herunter ( Öffnen Sie in 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();
}
});
}
}
Hier ist eine funktionierende Lösung für das Problem "Keine Vorschau verfügbar". Das genaue Problem liegt in der URL-Kodierung, die wir mit " http://docs.google.com/gview?url= " vergleichen. Das bedeutet, dass wir alle Sonderzeichen (:, /, & etc) von URL durch Unicode ersetzen müssen. Uri.encode ("") macht den Trick für uns.
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);
}
});