Ограничения на открытие pdf-файла в Android

Я пытаюсь открыть некоторые pdf из моего приложения для Android. Я использую намерение для этого:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);

этот код хорошо работает для некоторых pdf, но он терпит неудачу, когда я пытаюсь открыть другие.

это сообщение, которое Android показывает мне:

есть проблема с файлом.

Я должен упомянуть, что pdf, которые открываются без проблем, создаются с помощью одного шаблона Crystal Report и PDF-файлов что не создаются с другой.

в отличие от этого, если я открываю url-адрес PDF-файлов, которые терпят неудачу в моем браузере (на моем компьютере), он не дает мне никакой ошибки, открывая их, поэтому я думаю, что, возможно, есть какое-то ограничение на Android, которое отличается от некоторых pdf к другому (на шаблоне Crystal Report), но я не вижу его.

какие ограничения существуют при открытии pdf-файла на Android? (Размер, некоторые параметры Crystal Report, которые не разрешены, так далее...)

я отбросил, что это может быть ограничение размера, потому что pdf-файлы, которые дают проблемы, меньше, чем файлы, которые не дают никаких ошибок.

доказывает, что я сделал:

  • Открытие неправильных PDF-файлов в браузере ~ ~ > OK
  • загрузка неправильного PDF на мобильный телефон и откройте его ~ ~ > OK
  • Открытие неправильных PDF-файлов в приложении ~~>
  • Открытие хорошего PDF на APP компания, что PDFs аварии ~ ~ > OK

редактировать

я заметил, что я использовал http:// протокол, но PDF находится на https:// протокол, поэтому я изменил его на Uri.parse метод.

когда я сделал это изменение, приложение разбилось и ошибка была показана в журнале:

android.содержание.ActivityNotFoundException: не найдено действий для обработки Intent

кроме того, я заметил, что PDF-файлы, которые не дает мне никакой ошибки, находятся в url с http:// протокол вместо https:// Так что https:// протокол может быть проблема.

Я могу только открыть http:// запрос о намерениях?

9 ответов


это может быть файл не удалось интерпретировать с помощью приложения Android PDF viewer. Вы пытались скопировать / загрузить тот же файл на свой телефон Android и открыть оттуда?

кроме того, я бы предложил использовать IntentChooser для запуска PDF viewer, просто чтобы играть безопасно на не установлен PDF viewer / давая пользователю возможность выбрать приложение:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
Intent chooserIntent = Intent.createChooser(intent, "Open Report");
startActivity(chooserIntent);

Я нашел обходной путь для просмотра PDF-файла в моем приложении для Android (но не позволяет загрузить его после показа в приложении). Если я открою свой PDF-файл с помощью Google Docs, я могу открыть его с моим намерением.

Это то, что я должен был добавить перед моим url:

https://docs.google.com/gview?embedded=true&url=

таким образом, окончательный url будет выглядеть так:

https://docs.google.com/gview?embedded=true&url=https://myUrl.pdf

вот весь код, который я использую прямо сейчас:

String url= "https://docs.google.com/gview?embedded=true&url=https://url.pdf";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);

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

Если кто-нибудь знает, как открыть его с родным Android, пожалуйста, дайте мне знать.


что произойдет, если я не открою его с помощью Google Docs?

С тем же кодом, но просто используя мой url, вместо добавленного url Google Docs, Android позволяет мне выбирать между двумя приложениями: Adobe Acrobat Читатель и Google Chrome.

  • Если я открою его с помощью Google Chrome, он загрузит PDF, но он не откроется автоматически.

  • Если я открою его с помощью Adobe Acrobat Reader, он даст мне следующую ошибку:

    PDF не может быть показан (он не может быть открыт)


If API >=21 Вы можете использовать PDFRenderer для создания растрового изображения каждой страницы, но только для просмотра, а не для редактирования. Вот пример, который я придумал на лету, не имея навигационных кнопок, но их не должно быть сложно реализовать.

PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(new File("/path/to/file.pdf"), 
            ParcelFileDescriptor.MODE_READ_ONLY));
    PdfRenderer.Page page = renderer.openPage(0);
    Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(),
            Bitmap.Config.ARGB_8888);
    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    imageView.setImageBitmap(bitmap);
    page.close();
    renderer.close();

редактировать

PdfRenderer требует локального файла для FileDescriptor. Поэтому, в свою очередь, просмотр через "облако", насколько мне известно, невозможен при таком подходе.


простое добавление следующей библиотеки для android:- // в сборке уровня приложения компиляции в COM.джоанзапата.pdfview:android-pdfview:1.0.4@aar'

//inside your xml file
<com.joanzapata.pdfview.PDFView
    android:id="@+id/pdfview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

//inside java code

 pdfView.fromAsset(pdfName)
.pages(0, 2, 1, 3, 3, 3)
.defaultPage(1)
.showMinimap(false)
.enableSwipe(true)
.onDraw(onDrawListener)
.onLoad(onLoadCompleteListener)
.onPageChange(onPageChangeListener)
.load();

for more info:- use this github link

https://github.com/JoanZapata/android-pdfview


вы можете использовать Webview для открытия PDF из url-адреса следующим образом:

webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url);

используя намерение открыть pdf-файл с помощью https:// протокол, ни в коем случае https:// не проблема.

Я вижу, что вы пытаетесь этот метод определения типа данных:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);

но это приведет к:

ActivityNotFoundException: не найдено действий для обработки намерения

если вы используете этот другой метод, вероятно, вы не можете увидеть PDF readers в настройках, чтобы открыть такие файлы:

  Intent intent = new Intent();
  intent.setDataAndType(Uri.parse(url), "application/pdf");
  Intent chooserIntent = Intent.createChooser(intent, "Open Report");
  startActivity(chooserIntent);

вы должны попробовать этот метод без определения типа и он будет работать отлично:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);

другая причина этой проблемы открытие файла pdf через intent будет приложением по умолчанию для открытия такого рода файлов, поэтому, вероятно, у вас будет поврежденное или недействительное приложение, поэтому сбросьте значения по умолчанию:

на Settings. Нажмите Applications. Нажмите Default Applications.

выберите приложение и очистить значения по умолчанию


Вы можете попробовать это,

public void OpenPDFFile(String file_name) {
    try {
        File pdfFile = new File(getFile(), file_name);//File path
        if (pdfFile.exists()) //Checking for the file is exist or not
        {
            Uri path = Uri.fromFile(pdfFile);
            Intent objIntent = new Intent(Intent.ACTION_VIEW);
            objIntent.setDataAndType(path, "application/pdf");
            objIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            try {
                startActivity(objIntent);
                Log.e("IR", "No exception");
            }
            catch (ActivityNotFoundException e) {
                Log.e("IR", "error: " + e.getMessage());
                Toast.makeText(DownloadedPdfActivity.this,
                        "No Application Available to View PDF",
                        Toast.LENGTH_SHORT).show();
            }

        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

или

    mWebviewPdf.getSettings().setJavaScriptEnabled(true);
    mWebviewPdf.getSettings().setLoadWithOverviewMode(true);
    mWebviewPdf.getSettings().setUseWideViewPort(true);
    pDialog = new ProgressDialog(PdfActivity.this, android.R.style.Theme_DeviceDefault_Dialog);
    pDialog.setTitle("PDF");
    pDialog.setMessage("Loading...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    mWebviewPdf.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();
        }
    });
    **mWebviewPdf.loadUrl("https://docs.google.com/gview?embedded=true&url=" + mUrl);**


 String url= "https://docs.google.com/gview?embedded=true&url=" + mUrl;
 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
 startActivity(intent);

вы можете показать pdf в webview.


вы можете использовать следующую библиотеку для android: - / / в App level build compile

compile ' com.на GitHub.barteksc: android-pdf-просмотрщик: 2.6.1'

в вашем xml:

<com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdfView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

в вашей деятельности/ фрагмент:

pdfView.fromUri(Uri)
or
pdfView.fromFile(File)
or
pdfView.fromBytes(byte[])
or
pdfView.fromStream(InputStream) // stream is written to bytearray - native code cannot use Java Streams
or
pdfView.fromSource(DocumentSource)
or
pdfView.fromAsset(String)

для получения дополнительной информации, см. Этот ссылке


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