Limitations on opening pdf file in Android

2020-06-30 04:37发布

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?

标签: android pdf
9条回答
三岁会撩人
2楼-- · 2020-06-30 04:49

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.

查看更多
一纸荒年 Trace。
3楼-- · 2020-06-30 04:56

You can use Webview to open PDF from url like this:

webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url);
查看更多
闹够了就滚
4楼-- · 2020-06-30 04:56

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

查看更多
时光不老,我们不散
5楼-- · 2020-06-30 04:58

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.

查看更多
The star\"
6楼-- · 2020-06-30 05:02

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: https://github.com/JoanZapata/android-pdfview

查看更多
三岁会撩人
7楼-- · 2020-06-30 05:02

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

查看更多
登录 后发表回答