I am trying to opening some pdf from my Android application. I am using an Intent for doing that:
Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); startActivity(intent);
This code works well for some pdf but it fails when I try to open others.
This is the message that Android is showing to me:
There is a problem with the file.
I have to mention that the pdf that are being opened without problems are created with one Crystal Report template and the pdfs that are failing are created with another one.
As opposed, if I open the url of the pdfs that are failing on my browser (on my computer), it does not give to me any error opening them so I guess that maybe there is some limitation on Android that differs from some pdf to another (on Crystal Report template) but I cannot see it.
What limitations exist on opening a pdf file on Android? (Size, some parameters of Crystal Report that are not allowed, etc...)
I have discarded that it could be a size limitation because the pdf files that are giving problems are smaller than the files that do not give any error.
Proves I have done:
- Opening wrong PDFs on browser ~~> OK
- Downloading wrong PDF on mobile phone and open it ~~> OK
- Opening wrong PDFs on APP ~~> Error
- Opening good PDF on APP of the company that PDFs crash ~~> OK
EDIT
I have noticed that I was using http://
protocol but the PDF is on a https://
protocol, so I have changed it on Uri.parse
method.
When I made this change, the app crashed and an error was shown on the log:
android.content.ActivityNotFoundException: No Activity found to handle Intent
Also, I have noticed that the PDFs that does not give to me any error, are in an url with http://
protocol instead of https://
so I guess that https://
protocol can be the problem.
Am I only able to open http://
request on an Intent?
9 Answers
Answers 1
It could be the file failed to be interpret by the Android PDF viewer app. Have you tried to copy/download the exact same file to your Android phone and open from there?
Also, I'd suggest to use IntentChooser for launching the PDF viewer, just to play safe on no PDF viewer installed / giving user option to choose app:
Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); Intent chooserIntent = Intent.createChooser(intent, "Open Report"); startActivity(chooserIntent);
Answers 2
I found a workaround to view my PDF on my Android application (but does not allow me to download it after show on the application). If I open my PDF using Google Docs I can open it with my Intent.
This is what I had to add before my url:
https://docs.google.com/gview?embedded=true&url=
so the final url will be like:
https://docs.google.com/gview?embedded=true&url=https://myUrl.pdf
Here is the whole code I am using right now:
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);
But it is still not enough, because I would like to open it without need of using a third party application. Also, opening PDF with Google Docs is slow and I have to wait too much until the PDF is finally opened.
If anyone knows how to open it with native Android please let me know.
What happens if I do not open it with Google Docs?
With the same code, but just using my url, instead the added Google Docs url, Android let me choose between two applications: Adobe Acrobat Reader and Google Chrome.
If I open it with Google Chrome it download the PDF but it is not opened automatically.
If I open it with Adobe Acrobat Reader, it gives to me the following error:
The PDF cannot be shown (it cannot be opened)
Answers 3
Simple add following library for android:- //in app level build compile 'com.joanzapata.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
Answers 4
You can use Webview to open PDF from url like this:
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url);
Answers 5
If API >=21 you can use PDFRenderer to create a bitmap of each page, but its only viewable, not editable. Here is an example i made up on the fly, lacking navigation buttons, but those shouldn't be to hard to implement.
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 requires a local file for the FileDescriptor. So in turn viewing through the "cloud", to my knowledge, isnt possible with this approach.
Answers 6
Using an intent to open a pdf file with https://
protocol, definitelly https://
isn´t the problem.
I see that you are trying this method defining the data type:
Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); startActivity(intent);
but it will cause:
ActivityNotFoundException: No Activity found to handle Intent
if you use this other method probably you can´t see PDF readers in the options to open this kind of files:
Intent intent = new Intent(); intent.setDataAndType(Uri.parse(url), "application/pdf"); Intent chooserIntent = Intent.createChooser(intent, "Open Report"); startActivity(chooserIntent);
You must try this method without the type definition and it will work perfectly:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent);
Other cause of this problem opening the pdf file via intent would be the default application to open this kind of files, so probably you will have a corrupt or invalid application configured, so reset the defaults:
Go to Settings
. Tap Applications
. Tap Default Applications
.
Select the app and Clear defaults
Answers 7
You can try this,
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(); } }
or
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);
You can show pdf in webview.
Answers 8
You can use following library for android:- //in app level build compile
compile 'com.github.barteksc:android-pdf-viewer:2.6.1'
in your xml:
<com.github.barteksc.pdfviewer.PDFView android:id="@+id/pdfView" android:layout_width="match_parent" android:layout_height="match_parent"/>
in your activity/ fragment:
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)
For more information, refer this link
Answers 9
Your problem is that Your pdf is downloading inside the Data/data folder and when you try to open using default intent then external app doesn't have any permissions to open the file from inside the data/data folder so you need to download the file outside directory of the app and then try to reopen it will be working.
0 comments:
Post a Comment