Открытие файла .pdf веб-сайта в моем веб-обзоре (студия Android) [дубликат]

Импорт может быть объявлен только в области «Единица компиляции», они не могут быть объявлены в «Области класса».

Переместите этот импорт за пределы класса, и все должно работать нормально. [ ! d1]

84
задан Diego Palomar 7 February 2014 в 10:03
поделиться

7 ответов

Загрузить исходный код здесь ( Открыть 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();
            }
        });
    }
}
0
ответ дан Anshuman Jaiswal 15 August 2018 в 14:49
поделиться
  • 1
    Вы открываете файл Google Диска, который не является PDF-файлом, как на SD-карте устройства – cricket_007 25 April 2017 в 12:40
  • 2
    Да В этой демонстрации я показываю файл pdf в формате Google. Если вы хотите показать свой pdf-файл с SD-карты, проверьте эту демонстрационную версию. [Д0] deepshikhapuri.wordpress.com/2017/04/24/… – Deepshikha Puri 25 April 2017 в 16:28

Вы можете использовать проект Mozilla pdf.js . В основном это покажет вам PDF. Взгляните на их пример .

Я использую его только в браузере (рабочий стол и мобильный), и он работает нормально.

3
ответ дан Benjamin 15 August 2018 в 14:49
поделиться
  • 1
    привет @paulo, можете ли вы предоставить мне пример о том, как использовать это с Android? – Khalid ElSayed 2 June 2014 в 12:23
  • 2
    @KhalidElSayed Я думаю, что butelo преуспел в вашей цели: stackoverflow.com/a/21383356/505893 – bluish 18 June 2014 в 14:27
  • 3
    Может ли pdf.js использоваться локально? Я имею в виду, может ли он использоваться в приложении, которое используется в локальной сети без доступа к Интернету, но взаимодействует с локальным сервером? – JasonStack 19 December 2017 в 09:00

Вы можете использовать Google Docs Viewer для чтения своего онлайн-документа:

WebView webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true); 
String pdf = "http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf";
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
140
ответ дан Murphy 15 August 2018 в 14:49
поделиться
  • 1
    отлично! я буду использовать это – binnyb 4 May 2011 в 16:30
  • 2
    Google Reader надежный? Если Google изменит URL-адрес? – Sreeram 24 January 2013 в 08:56
  • 3
    После тщательного тестирования в течение 2 дней я получил сообщение об ошибках в документах Google, в которых говорилось You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format..... Так что не кажется надежным. – Shobhit Puri 7 November 2014 в 16:33
  • 4
    Теперь URL-адрес Docs перенаправляется на «Диск»: drive.google.com/viewerng/viewer?embedded=true&url=" ; – Murphy 26 December 2014 в 23:02
  • 5
    Это решение абсолютно ужасно. Тот факт, что многие из вас считают, что что-то такое уродливое в вашем приложении беспокоит меня. Эта страница предназначена для рабочего стола. Этот сайт явно оптимизирован для рабочего стола. Использование этого на мобильных устройствах не является хорошим мобильным опытом. – clu 29 April 2016 в 23:58

Здесь нагрузка с progressDialog. Необходимо предоставить WebClient, иначе он заставит открываться в браузере:

final ProgressDialog pDialog = new ProgressDialog(context);
    pDialog.setTitle(context.getString(R.string.app_name));
    pDialog.setMessage("Loading...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    WebView webView = (WebView) rootView.findViewById(R.id.web_view);
    webView.getSettings().setJavaScriptEnabled(true);
    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();
        }
    });
    String pdf = "http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf";
    webView.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
2
ответ дан Naveen Kumar M 15 August 2018 в 14:49
поделиться

Открытие pdf-документа с использованием google docs - плохая идея с точки зрения пользовательского опыта. Это очень медленно и не реагирует.

Решение после API 21

Так как api 21, мы имеем PdfRenderer , который помогает преобразовать PDF в Bitmap. Я никогда не использовал его, но это кажется достаточно простым.

Решение для любого уровня api

Другое решение - загрузить PDF-файл и передать его через Intent в специальное PDF-приложение, которое будет выполнять работу с флагом. Быстрая и приятная работа с пользователем, особенно если эта функция не является центральной в вашем приложении.

Используйте этот код для загрузки и открытия PDF

public class PdfOpenHelper {

public static void openPdfFromUrl(final String pdfUrl, final Activity activity){
    Observable.fromCallable(new Callable<File>() {
        @Override
        public File call() throws Exception {
            try{
                URL url = new URL(pdfUrl);
                URLConnection connection = url.openConnection();
                connection.connect();

                // download the file
                InputStream input = new BufferedInputStream(connection.getInputStream());
                File dir = new File(activity.getFilesDir(), "/shared_pdf");
                dir.mkdir();
                File file = new File(dir, "temp.pdf");
                OutputStream output = new FileOutputStream(file);

                byte data[] = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
                return file;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<File>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(File file) {
                    String authority = activity.getApplicationContext().getPackageName() + ".fileprovider";
                    Uri uriToFile = FileProvider.getUriForFile(activity, authority, file);

                    Intent shareIntent = new Intent(Intent.ACTION_VIEW);
                    shareIntent.setDataAndType(uriToFile, "application/pdf");
                    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    if (shareIntent.resolveActivity(activity.getPackageManager()) != null) {
                        activity.startActivity(shareIntent);
                    }
                }
            });
}

}

Для того, чтобы Intent работал, вам необходимо создать файл FileProvider предоставить разрешение получающему приложению открывать файл.

Вот как вы его реализуете: в вашем манифесте:

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">

        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />

    </provider>

Наконец, создайте файл file_paths.xml в файле ресурсов

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="shared_pdf" path="shared_pdf"/>
</paths>

Hope это помогает =)

7
ответ дан Rahul Sharma 15 August 2018 в 14:49
поделиться

Если вы используете только URL-адрес представления, пользователю не будет предложено войти в учетную запись google.

https://docs.google.com/viewer?url=http://my.domain.com/yourPdfUrlHere.pdf
28
ответ дан slott 15 August 2018 в 14:49
поделиться

Это фактическое ограничение использования , которое разрешает Google, прежде чем вы получите ошибку, упомянутую в комментариях, если это один раз в жизни pdf, который пользователь откроет в приложении, тогда я чувствую его полностью безопасный , Хотя рекомендуется придерживаться собственного подхода, используя встроенную фреймворк в Android от Android 5.0 / Lollipop, он называется PDFRenderer .

0
ответ дан war_Hero 15 August 2018 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: