Подтвердить что ты не робот

Ограничения на открытие файла 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 файлов в APP ~~ > Ошибка
  • Открытие хорошего PDF на APP компании, что сбой PDF файлов ~~ > OK

ИЗМЕНИТЬ

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

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

android.content.ActivityNotFoundException: активность не обнаружена для обработки намерения

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

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

4b9b3361

Ответ 1

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

Это то, что я должен был добавить до моего 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?

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

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

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

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

Ответ 2

Может быть, файл не может быть интерпретирован приложением Android PDF Viewer. Вы пытались скопировать/загрузить тот же самый файл на свой Android-телефон и открыть оттуда?

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

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

Ответ 3

Просто добавьте следующую библиотеку для Android: -    // в построении уровня приложения    compile 'com.joanzapata.pdfview: android-pdfview: [email protected]'

//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

Ответ 4

Вы можете использовать Webview, чтобы открыть PDF из URL-адреса, например:

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

Ответ 5

Если 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();

Edit

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

Ответ 6

Используя намерение открыть файл pdf с протоколом https://, definitelly https:// не проблема.

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

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

но это вызовет:

ActivityNotFoundException: для управления Intent не найдено действий

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

  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 с помощью намерения, было приложение по умолчанию для открытия таких файлов, поэтому, возможно, у вас будет поврежденный или недействительный приложение, поэтому reset по умолчанию:

Перейдите к Settings. Нажмите Applications. Нажмите Default Applications.

Выберите приложение и Clear defaults

Ответ 7

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

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.

Ответ 8

Вы можете использовать следующую библиотеку для android: -//в компиляции уровня приложения

compile 'com.github.barteksc: android-pdf-viewer: 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)

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

Ответ 9

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