2016-07-26 95 views
2

我安裝this庫,從我的應用程序中的URL查看PDF,但是當我點擊該文件以打開它給了我下面的錯誤:Android的PDF查看器,FileNotFoundException異常

我試圖尋找到ContentResolver的,但沒有運氣

這是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) 

活動是:

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();}} 

XML是:

<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> 
+0

你能訪問手機上的瀏覽器網址? –

+0

是的,它開始下載我的手機上的pdf –

+1

我猜圖書館期望一個ContentProvider的URI,而不是一個網絡地址 –

回答

0

No content provider: http://...

,你讀庫可下載和顯示來自網絡請求的PDF目前尚不清楚。 URI可能意味着很多東西,在這種情況下,它試圖使用ContentProvider從磁盤加載原始PDF文件。

您可以查看該庫的Github庫,以獲取該URI的示例用法。

2

烏里並不像網址:here

您必須先下載* .pdf文件並保存到SD和finaly你可以用Pdfview打開它。

+0

「庫不支持遠程內容,所以它按預期工作。內部存儲器。」從https://github.com/barteksc/AndroidPdfViewer/issues/2 – CrisBarreiro

1

似乎這個庫無法從互聯網上下載文件。將文件下載到一個臨時目錄,並打開它:

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(); 
    } 
} 

}

相關問題