Android PdfViewer-FileNotFoundException

ANDRE BOL picture ANDRE BOL · Jul 26, 2016 · Viewed 8k times · Source

I installed this library to view pdf from a url inside my application but when I click on the file to open it gives me the following error:

I tried looking into ContentResolver but no luck

This is the logcat:

07-26 15:35:45.638 8725-8725/com.focuson.iapp.firstapp E/PDFView: load pdf error
java.io.FileNotFoundException: No content provider: http://pub.mylaravel.eu/assets/user_files/3/file_no_1.pdf
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1093)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:944)
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:797)
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:751)
at com.github.barteksc.pdfviewer.DecodingAsyncTask.getSeekableFileDescriptor(DecodingAsyncTask.java:82)
at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:61)
at com.github.barteksc.pdfviewer.DecodingAsyncTask.doInBackground(DecodingAsyncTask.java:30)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)

My activity is:

public class pdfActivity extends AppCompatActivity {
PDFView pdfView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pdf);
    pdfView= (PDFView) findViewById(R.id.pdfView);
    String url=getIntent().getStringExtra("url");
    Log.i("URI-URL",String.valueOf(Uri.parse(url)) );
    pdfView.fromUri(Uri.parse(url))
            .enableSwipe(true)
            .enableDoubletap(true)
            .swipeVertical(false)
            .defaultPage(1)
            .showMinimap(false)
            .onLoad(new OnLoadCompleteListener() {
                @Override
                public void loadComplete(int nbPages) {

                }
            })
            .onPageChange(new OnPageChangeListener() {
                @Override
                public void onPageChanged(int page, int pageCount) {

                }
            })
            .enableAnnotationRendering(false)
            .password(null)
            .load();}}

My xml is:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.focuson.iapp.firstapp.page_types.Login.pdfActivity">

<com.github.barteksc.pdfviewer.PDFView
    android:id="@+id/pdfView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</RelativeLayout>

Answer

Golan Shay picture Golan Shay · Mar 28, 2017

Seems that this library fails to download files from the internet. Download the file to a temp directory and open it:

if (ActivityCompat.checkSelfPermission(WebViewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(WebViewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(WebViewActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
        } else {
            downloadFile();
        }

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE:
            downloadFile();
            break;
    }
}

private void downloadFile() {
    progressBar.setVisibility(View.VISIBLE);
    DownloadFileTask task = new DownloadFileTask(
            WebViewActivity.this,
            mURL,
            "/download/pdf_file.pdf");
    task.startTask();
}

@Override
public void onFileDownloaded() {
    progressBar.setVisibility(View.GONE);
    File file = new File(Environment.getExternalStorageDirectory()
            .getAbsolutePath()
            + "/download/pdf_file.pdf");
    if (file.exists()) {
        pdfView.fromFile(file)
                //.pages(0, 2, 1, 3, 3, 3) // all pages are displayed by default
                .enableSwipe(true)
                .swipeHorizontal(true)
                .enableDoubletap(true)
                .defaultPage(0)
                .enableAnnotationRendering(true)
                .password(null)
                .scrollHandle(null)
                .onLoad(new OnLoadCompleteListener() {
                    @Override
                    public void loadComplete(int nbPages) {
                        pdfView.setMinZoom(1f);
                        pdfView.setMidZoom(5f);
                        pdfView.setMaxZoom(10f);
                        pdfView.zoomTo(2f);
                        pdfView.scrollTo(100,0);
                        pdfView.moveTo(0f,0f);
                    }
                })
                .load();

    }
}

public class DownloadFileTask {
public static final String TAG = "DownloadFileTask";

private BaseActivity context;
private GetTask contentTask;
private String url;
private String fileName;

public DownloadFileTask(BaseActivity context, String url, String fileName) {
    this.context = context;
    this.url = url;
    this.fileName = fileName;
}

public void startTask() {
    doRequest();
}

private void doRequest() {
    contentTask = new GetTask();
    contentTask.execute();
}

private class GetTask extends AsyncTask<String, Integer, String> {

    @Override
    protected String doInBackground(String... arg0) {
        int count;
        try {
            Log.d(TAG, "url = " + url);
            URL _url = new URL(url);
            URLConnection conection = _url.openConnection();
            conection.connect();
            InputStream input = new BufferedInputStream(_url.openStream(),
                    8192);
            OutputStream output = new FileOutputStream(
                    Environment.getExternalStorageDirectory() + fileName);
            byte data[] = new byte[1024];
            while ((count = input.read(data)) != -1) {
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
        }
        return null;
    }

    protected void onPostExecute(String data) {
        context.onFileDownloaded();
    }
}

}