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