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