2012-04-03 4 views
4

Ich verwende http://www.siegmann.nl/epublib, um Epub-Datei zu lesen. Mein Code wird unten erwähnt.Android: Epub-Datei zeigt keine Bilder im Emulator/Android-Gerät

try { 
    book = epubReader.readEpub(new FileInputStream("/sdcard/EpubTesting.epub")); 

     Resource res; 
     Spine contents = book.getSpine(); 

     List<SpineReference> spinelist = contents.getSpineReferences(); 
     StringBuilder string = new StringBuilder(); 
     String line = null; 
     int count = spinelist.size(); 


     for (int i=0;i<count;i++){ 
      res = contents.getResource(i); 
      try { 
      InputStream is = res.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 

      try { 
       while ((line = reader.readLine()) != null) { 
         linez = (string.append(line+"\n")).toString(); 
       } 

      } catch (IOException e) {e.printStackTrace();} 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 


     System.out.println(linez); 
     s1.loadDataWithBaseURL("/sdcard/",linez, "text/html", "UTF-8",null); 

    }catch (FileNotFoundException e) { 

     Toast.makeText(mContext, "File not found.", Toast.LENGTH_SHORT).show(); 
    } catch (IOException e) { 
     Toast.makeText(mContext, "IO Exception.", Toast.LENGTH_SHORT).show(); 
    } 

versuchte auch

s1.loadDataWithBaseURL("",linez, "text/html", "UTF-8",null); 
s1.loadDataWithBaseURL("file://mnt/sdcard/",linez, "text/html", "UTF-8",null); 

Aber Ergebnis ist Sifar. Bitte sagen Sie mir, was ich tun muss, um die enthaltenen Bilder in der Datei anzuzeigen. Ich habe die FAQ durchgehen sagt Machen Sie eine Unterklasse von android.webkit.WebView, die die loadUrl(String) Methode so überlädt, dass sie das Bild aus dem Buch statt aus dem Internet lädt. Aber bis ich nicht weiß, wo sie die Datei extrahieren, wie kann ich den Pfad finden. Erzähl es mir bitte. Ich bin sehr verwirrt. Danke im Voraus.

Antwort

3

Dafür müssen Sie alle Ressourcen von epub-Dateien (d. H. Bilder, Stylesheet) in Speicherort herunterladen, wo Sie .epub-Datei in SD-Karte heruntergeladen. Bitte überprüfen Sie den folgenden Code, um Bilder und CSS-Dateien aus EPUB-Dateien mit epublib herunterzuladen. Dafür müssen Sie Parameter der Dateiobjekte senden, wo Sie diese Bilder speichern möchten.

private void DownloadResource(File FileObj,String filename) { 
    try { 
    InputStream epubis = new FileInputStream(FileObj); 
    book = (new EpubReader()).readEpub(epubis); 

    Resources rst = book.getResources(); 
    Collection<Resource> clrst = rst.getAll(); 
    Iterator<Resource> itr = clrst.iterator(); 

    while (itr.hasNext()) { 
    Resource rs = itr.next(); 

    if ((rs.getMediaType() == MediatypeService.JPG) 
     || (rs.getMediaType() == MediatypeService.PNG) 
     || (rs.getMediaType() == MediatypeService.GIF)) { 
    File oppath1 = new File(directory, "Images/" 
     + rs.getHref().replace("Images/", "")); 

    oppath1.getParentFile().mkdirs(); 
    oppath1.createNewFile(); 

    FileOutputStream fos1 = new FileOutputStream(oppath1); 
    fos1.write(rs.getData()); 
    fos1.close(); 

    } else if (rs.getMediaType() == MediatypeService.CSS) { 
    File oppath = new File(directory, "Styles/" 
     + rs.getHref().replace("Styles/", "")); 

    oppath.getParentFile().mkdirs(); 
    oppath.createNewFile(); 

    FileOutputStream fos = new FileOutputStream(oppath); 
    fos.write(rs.getData()); 
    fos.close(); 

    } 

    } 


    } catch (Exception e) { 
    Log.v("error", e.getMessage()); 
    } 
} 

Danach verwenden Sie diesen Code, um den Pfad der Bilder in Webview festzulegen. wenn in SD-Karte gespeichert dann

s1.loadDataWithBaseURL("file:///sdcard/",linez, "text/html",null,null); 

oder

s1.loadDataWithBaseURL("file://mnt/sdcard/",linez, "text/html", "UTF-8",null); 

wenn in internen Speicher dann

s1.loadDataWithBaseURL("file:///data/data/com.example.project/app_mydownload/",linez, "text/html",null,null); 
13
public class EpubBookContentActivity extends Activity{ 

private static final String TAG = "EpubBookContentActivity"; 
WebView webview; 

Book book; 

int position = 0; 

String line; 
int i = 0; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.content); 

    webview = (WebView) findViewById(R.id.webView); 
    webview.getSettings().setJavaScriptEnabled(true); 

    AssetManager assetManager = getAssets(); 
    String[] files; 

    try { 

     files = assetManager.list("books"); 
     List<String> list =Arrays.asList(files); 

     if (!this.makeDirectory("books")) { 
      debug("faild to make books directory"); 
     } 

     copyBookToDevice(list.get(position)); 

     String basePath = Environment.getExternalStorageDirectory() + "/books/"; 

     InputStream epubInputStream = assetManager.open("books/"+list.get(position)); 

     book = (new EpubReader()).readEpub(epubInputStream); 

     DownloadResource(basePath); 

     String linez = ""; 
     Spine spine = book.getSpine(); 
     List<SpineReference> spineList = spine.getSpineReferences() ; 
     int count = spineList.size(); 

     StringBuilder string = new StringBuilder(); 
     for (int i = 0; count > i; i++) { 

      Resource res = spine.getResource(i); 

      try { 
       InputStream is = res.getInputStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
       try { 
        while ((line = reader.readLine()) != null) { 
         linez = string.append(line + "\n").toString(); 
        } 

       } catch (IOException e) {e.printStackTrace();} 


      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 

     linez = linez.replace("../", ""); 

//   File file = new File(Environment.getExternalStorageDirectory(),"test.html"); 
//   file.createNewFile(); 
//   FileOutputStream fileOutputStream = new FileOutputStream(file); 
//   fileOutputStream.write(linez.getBytes()); 
//   fileOutputStream.close(); 


     webview.loadDataWithBaseURL("file://"+Environment.getExternalStorageDirectory()+"/books/", linez, "text/html", "utf-8", null); 

    } catch (IOException e) { 
     Log.e("epublib exception", e.getMessage()); 
    } 
} 

public boolean makeDirectory(String dirName) { 
    boolean res;   

    String filePath = new String(Environment.getExternalStorageDirectory()+"/"+dirName); 

    debug(filePath); 
    File file = new File(filePath); 
    if (!file.exists()) { 
     res = file.mkdirs(); 
    }else { 
     res = false;   
    } 
    return res; 
} 

public void debug(String msg) { 
    //  if (Setting.isDebug()) { 
    Log.d("EPub", msg); 
    //  } 
} 

public void copyBookToDevice(String fileName) {  
    System.out.println("Copy Book to donwload folder in phone"); 
    try 
    { 
     InputStream localInputStream = getAssets().open("books/"+fileName); 
     String path = Environment.getExternalStorageDirectory() + "/books/"+fileName; 
     FileOutputStream localFileOutputStream = new FileOutputStream(path); 

     byte[] arrayOfByte = new byte[1024]; 
     int offset; 
     while ((offset = localInputStream.read(arrayOfByte))>0) 
     { 
      localFileOutputStream.write(arrayOfByte, 0, offset);     
     } 
     localFileOutputStream.close(); 
     localInputStream.close(); 
     Log.d(TAG, fileName+" copied to phone"); 

    } 
    catch (IOException localIOException) 
    { 
     localIOException.printStackTrace(); 
     Log.d(TAG, "failed to copy"); 
     return; 
    } 
} 



private void DownloadResource(String directory) { 
    try { 

     Resources rst = book.getResources(); 
     Collection<Resource> clrst = rst.getAll(); 
     Iterator<Resource> itr = clrst.iterator(); 

     while (itr.hasNext()) { 
      Resource rs = itr.next(); 

      if ((rs.getMediaType() == MediatypeService.JPG) 
              || (rs.getMediaType() == MediatypeService.PNG) 
              || (rs.getMediaType() == MediatypeService.GIF)) { 

       Log.d(TAG, rs.getHref()); 

       File oppath1 = new File(directory, rs.getHref().replace("OEBPS/", ""));  

       oppath1.getParentFile().mkdirs(); 
       oppath1.createNewFile(); 

       System.out.println("Path : "+oppath1.getParentFile().getAbsolutePath()); 


       FileOutputStream fos1 = new FileOutputStream(oppath1); 
       fos1.write(rs.getData()); 
       fos1.close(); 

      } else if (rs.getMediaType() == MediatypeService.CSS) { 

       File oppath = new File(directory, rs.getHref()); 

       oppath.getParentFile().mkdirs(); 
       oppath.createNewFile(); 

       FileOutputStream fos = new FileOutputStream(oppath); 
       fos.write(rs.getData()); 
       fos.close(); 

      } 

     } 


    } catch (Exception e) { 

    } 
} 
} 
+0

Dank einer Tonne Kirti, es ist eine schöne Demo. Vielen Dank. Aber hier ist ein Problem, das Bilder nicht zeigen. Haben Sie ein Update zu diesem Thema? –

+1

css & Bilder werden in den Speicher/sdcard0/books/images & ..same path/css heruntergeladen, aber nicht auf dem Bildschirm angezeigt. css wurde erfolgreich angewendet. Ausgabe nur mit Bildern –

+0

Speichern Sie die Buchdaten in file.just Kommentar in meinem Code entfernen. und legen Sie die Bilder und die Datei test.html in den gleichen Ordner und überprüfen Sie das Problem –