[英]Android WebView does not display PDF
我已經花了數小時進行搜索和嘗試,但是仍然無法正常工作。 我正在嘗試在fragment
的WebView
內部顯示PDF文件。
加載所有內容后,WebView僅顯示空白屏幕。
這是我的代碼片段.java:
final View webViewLayout = layoutInflater.inflate(R.layout.webview_empty, null);
linearLayout.addView(webViewLayout);
WebView webview = (WebView) linearLayout.findViewById(R.id.webview);
String myPdfUrl = "gymnasium-wandlitz.de/vplan/vplan.pdf";
//String url = "http://staglay.com/pdfjs/web/viewer.html";
webview.getSettings().setJavaScriptEnabled(true);
String url = "http://docs.google.com/viewer?embedded=true&url="+myPdfUrl;
webview.setWebViewClient(new MyWebViewClient());
webview.loadUrl(url);
而我的webview xml:
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
這是我的Logcat:
09-13 13:01:08.299 8501-8501/de.toeducate.tosub I/art: Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.ServiceWorkerControllerAdapter>
09-13 13:01:08.299 8501-8501/de.toeducate.tosub I/art: Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.ServiceWorkerControllerAdapter>
09-13 13:01:08.302 8501-8501/de.toeducate.tosub I/art: Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.TokenBindingManagerAdapter>
09-13 13:01:08.302 8501-8501/de.toeducate.tosub I/art: Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.TokenBindingManagerAdapter>
09-13 13:01:08.308 8501-8501/de.toeducate.tosub I/cr_LibraryLoader: Time to load native libraries: 1 ms (timestamps 5927-5928)
09-13 13:01:08.308 8501-8501/de.toeducate.tosub I/cr_LibraryLoader: Expected native library version number "52.0.2743.98", actual native library version number "52.0.2743.98"
09-13 13:01:08.319 8501-8501/de.toeducate.tosub V/WebViewChromiumFactoryProvider: Binding Chromium to main looper Looper (main, tid 1) {a6e1879}
09-13 13:01:08.319 8501-8501/de.toeducate.tosub I/cr_LibraryLoader: Expected native library version number "52.0.2743.98", actual native library version number "52.0.2743.98"
09-13 13:01:08.319 8501-8501/de.toeducate.tosub I/chromium: [INFO:library_loader_hooks.cc(143)] Chromium logging enabled: level = 0, default verbosity = 0
09-13 13:01:08.331 8501-8501/de.toeducate.tosub I/cr_BrowserStartup: Initializing chromium process, singleProcess=true
09-13 13:01:08.389 8501-10510/de.toeducate.tosub W/cr_media: Requires BLUETOOTH permission
09-13 13:01:08.427 8501-10516/de.toeducate.tosub D/ConnectivityManager.CallbackHandler: CM callback handler got msg 524290
09-13 13:01:08.438 8501-8501/de.toeducate.tosub W/cr_AwContents: onDetachedFromWindow called when already detached. Ignoring
09-13 13:01:08.453 8501-8501/de.toeducate.tosub I/cr_Ime: ImeThread is not enabled.
09-13 13:01:08.477 8501-8501/de.toeducate.tosub W/cr_AwContents: onDetachedFromWindow called when already detached. Ignoring
09-13 13:01:08.480 8501-8501/de.toeducate.tosub I/cr_Ime: ImeThread is not enabled.
09-13 13:01:08.504 8501-10516/de.toeducate.tosub D/ConnectivityManager.CallbackHandler: CM callback handler got msg 524290
09-13 13:01:08.527 8501-10523/de.toeducate.tosub E/libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)
09-13 13:01:08.547 8501-10523/de.toeducate.tosub W/VideoCapabilities: Unrecognized profile 2130706433 for video/avc
09-13 13:01:08.557 8501-10523/de.toeducate.tosub W/VideoCapabilities: Unrecognized profile/level 0/0 for video/mpeg2
09-13 13:01:08.557 8501-10523/de.toeducate.tosub W/VideoCapabilities: Unrecognized profile/level 0/2 for video/mpeg2
09-13 13:01:08.557 8501-10523/de.toeducate.tosub W/VideoCapabilities: Unrecognized profile/level 0/3 for video/mpeg2
09-13 13:01:08.572 8501-10523/de.toeducate.tosub I/VideoCapabilities: Unsupported profile 4 for video/mp4v-es
09-13 13:01:08.619 8501-8501/de.toeducate.tosub W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 8501
09-13 13:01:08.620 8501-8501/de.toeducate.tosub W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 8501
09-13 13:01:08.904 8501-8501/de.toeducate.tosub W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 8501
09-13 13:01:09.039 8501-8501/de.toeducate.tosub W/cr_BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 8501
更新:
在onCreateView方法中:
View view=inflater.inflate(R.layout.fragment_crime_list,container,false);
LinearLayout linearLayout = (LinearLayout)view.findViewById(R.id.linearLayout);
View webViewLayout = LayoutInflater.from(getActivity()).inflate(R.layout.webview, linearLayout,false);
WebView webView = (WebView) webViewLayout.findViewById(R.id.webview1);
linearLayout.addView(webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
String myPdfUrl = "gymnasium-wandlitz.de/vplan/vplan.pdf";
String url = "https://docs.google.com/viewer?embedded=true&url="+myPdfUrl;
webView.loadUrl(url);
WebView webview = (WebView) linearLayout.findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
String pdf = "gymnasium-wandlitz.de/vplan/vplan.pdf";
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
更新XML文件
<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在此處鏈接以獲取更多信息: 幫助
我建議您采用另一種方式-省略Google文檔。
看一下PdfViewer
項目。 將assets/pdfviewer/
所有文件復制到您的項目中。
將一個文件index.html
添加到同一文件夾中:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="file:///android_asset/pdfviewer/minimal.css"/>
<script type="text/javascript" src="file:///android_asset/pdfviewer/compatibility.js"></script>
<!-- horrible hack needs fix-->
<script type="text/javascript">
var url = 'THE_FILE';
</script>
</head>
<body>
<div>
<canvas id="the-canvas"/>
</div>
<!-- Use latest PDF.js build from Github -->
<script type="text/javascript" src="file:///android_asset/pdfviewer/pdf.js"></script>
<script type="text/javascript" src="file:///android_asset/pdfviewer/customview.js"></script>
</body>
</html>
將.pdf文件下載到您的手機並獲取其Uri
。
然后設置Webview:
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN)
{
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
}
settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setWebViewClient(new WebViewClient());
並將文件加載到WebView
:
Uri path = Uri.parse(/**/);
InputStream ims = null;
FileOutputStream fileOutputStream = null;
try {
ims = getAssets().open("pdfviewer/" + INDEX_HTML);
String line = getStringFromInputStream(ims);
if (line.contains(FILE_INDICATOR)) {
line = line.replace(FILE_INDICATOR, path.toString());
fileOutputStream = openFileOutput(INDEX_HTML, Context.MODE_PRIVATE);
fileOutputStream.write(line.getBytes());
fileOutputStream.close();
}
} catch (IOException e) {
try {
if (ims != null) {
ims.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException inputOutputException) {
return;
}
return;
}
runOnUiThread( new Runnable() {
@Override
public void run() {
webView.loadUrl("file://" + getFilesDir() + "/" + INDEX_HTML);
webView.scrollTo(webView.getWidth() / 2, 0);
}
});
String myPdfUrl = "http://gymnasium-wandlitz.de/vplan/vplan.pdf";
webview.getSettings().setJavaScriptEnabled(true);
String url = "http://docs.google.com/viewer?embedded=true&url="+myPdfUrl;
webview.setWebViewClient(new MyWebViewClient());
webview.loadUrl(url);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.