Intereting Posts
Android ViewPager – просмотр предварительного просмотра страницы слева и справа Проблемы с использованием Rhino на Android Android: Существуют ли устройства плотности xxxhdpi? API Android L Youtube – IllegalArgumentException: служебное намерение должно быть явным Что такое «android: windowSoftInputMode» для веб-сайта? Как обновить индикатор прогресса в элементе ListView Проверьте, находится ли маркер внутри радиуса круга Использование режима USB-хоста 3.1 с Arduino Как увидеть предупреждения Gradle на Android Studio? Как сделать телефонный звонок в android и вернуться к моей активности, когда звонок будет завершен? Заменить фрагмент другим фрагментом внутри ViewPager Как включить ведение журнала для apache commons HttpClient на Android Не удается создать и запустить проект тестирования Android, созданный с помощью «ant create test-project», когда тестируемый проект имеет банки в каталоге libs Android – прослушивание входящих SMS-сообщений Android: изменение ресурсов строк программно

Android PDF не загружается в браузере и WebView

Я пытаюсь загрузить файлы PDF в Android Webview. Когда я разобрал его. Лучший ответ, который я нашел, – это использовать Документы Google. Теперь, что я сделал, добавьте URL-адрес файла PDF в конце этого URL-адреса https://docs.google.com/gview?embedded=true&url=

А затем загрузите этот полный URL-адрес в веб-обозревателе Android. Он загружает PDF успешно. Но есть один файл PDF по следующему URL-адресу, который не загружается в WebView, а также в браузере Chrome (в моей системе). URL-адрес PDF

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

И Когда я пытаюсь загрузить PDF как 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

То он говорит, что нет предварительного просмотра. Может кто-нибудь, пожалуйста, скажите мне, что здесь не так.

Solutions Collecting From Web of "Android PDF не загружается в браузере и WebView"

Это не полный ответ. Я исследовал несколько возможностей, но до сих пор не имею убедительного объяснения этого поведения.

Теория A: кодировка URL … no

Моя первая мысль была такой же, как @ gn1 – фигурные скобки нуждались в кодировке URL . К сожалению, кодировка параметра url не изменяет результат.

Теория B: Плохой файл PDF … нет

Затем я подумал, что, возможно, Google Docs не может справиться с этим конкретным файлом PDF – это неподдерживаемая версия или использует дополнительные функции или даже ошибки, которые допускают другие зрители. Я загрузил копию и разместил ее на другом сайте. Когда я указал Google Docs на новое место, он просмотрел все.

Теория C: Uncooperative site … no

Затем я подумал, что, возможно, этот сайт не сотрудничает с Google Docs по какой-то причине – возможно, это блокирует Google от его индексации. Я нашел другую ссылку PDF на том же сайте по той же схеме:

http://www.expertagent.co.uk/asp/in4glestates/%7B6dad6f28-a59d-4b54-b277-52f077f4927f%7D/%7Be3a6d17c-d6a8-4e92-8f52-09c6721515fc%7D/External.pdf

Когда я указал Google Docs на эту ссылку, она была просмотрена в порядке.

Теория D: разные метаданные … нет

Теперь у меня была одна ссылка, которая работала, а другая – нет. Возможно, их метаданные были разными – например, возможно, тот, который работал, был помечен application / pdf, а другой – нет. Поэтому я посмотрел заголовки HTTP.

Рабочий 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 

Не работает 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 

Я не вижу существенных различий в метаданных.

Теория E: странный запрос от Google … нет

В этот момент я, по общему признанию, хватаюсь за соломинку. Я задавался вопросом, был ли запрос от Google каким-то иным образом – возможно, он попросил диапазон байтов или нечеткое сжатие или что-то еще, и целевой сервер не справился с этим последовательно. Поэтому я указал Google Docs на контролируемый мной сайт, чтобы посмотреть, как выглядит 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) 

Это совсем не странно. Я проверил, что целевой сайт игнорирует запросы на сжатие, поэтому это не случай сжатия с ошибкой. Я также попытался обратиться к целевому сайту с этим заголовком User-Agent, и это, похоже, не имело значения.


Поэтому я нашел подсказки, которые помогают рассказать нам, что не проблема, но пока ничего не объясняет, что это такое. Я отправляю в надежде, что эти отрицательные результаты все равно будут полезны кому-то.

Я использую это и работает для меня: 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); } } 

Оформить код примера для открытого PDF без загрузки, в веб-просмотре .

 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; } } 

По взглядам вещей URL-адрес, на который вы указываете, содержит ссылки на определенные устройства.

Вы можете посмотреть загрузку файла во внутреннее хранилище, а затем использовать намерение загрузить PDF с любым установленным приложением.

От того, как открыть PDF через Intent с 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); 

В качестве альтернативы вы можете создать экземпляр файла с веб-адресом

Я помещаю файл на свой сервер, и он отлично работает. Это проблема Документов Google, встречающаяся в URL-адресе или файле robots.txt. Документ в порядке. Вы можете использовать переписывание URL-адресов, чтобы заставить Google Docs обманываться, думая, что это из другой папки. Эти странные символы на пути могут быть проблемой.

Док загружается штрафом

Загрузите исходный код отсюда ( Open pdf в 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(); } }); } }