2013-05-07 106 views
0

我會恢復一些我在網上找到的技巧來解決我的問題。Android:從webview中讀取圖像,將圖像寫入webview

我有一個cookie來管理一個https連接,所以我用'神話'android webview來獲取我需要的信息(html頁面的一部分)。

因此,問題來了:如何將一些html從webview傳輸到另一個? (例如:我有一個專爲桌面瀏覽器設計的webmail站點,我想在我的應用程序中顯示適合我設備屏幕的郵件內容)。

即使解決方案有點複雜,我會嘗試解釋一部分解決方案。

我定義了一個Java的類接口從web視圖中的「的onCreate」活動方法調用:

WebView webview = (WebView) findViewById(R.id.webview); 
(...) 
webview.addJavascriptInterface(new MyJavaInterface(), "myJavaInterface"); 

其中MyJavaInterface類包含一個public void myMethod(String myHtml)

然後使用JavaScript注入來獲得HTML從我的webview使用istruction webview.loadUrl("javascript:window.myJavaInterface.myMethod(...)");調用我的自定義java界面,並在myMethod中獲取我需要傳輸到新的webview(String myHtml)的html。

在這種方法(public void myMethod(String myHtml))我使用指令

newwebview.loadData("<html><body>"+myHtml+"</body></html>", "text/html", "utf-8"); 

讓我的目標。但這不是全部,因爲我的新webview將顯示我需要的html,除了圖像(外部CSS樣式表和JavaScript文件)。

所以:如何'運輸'的圖像?

回答

0

這裏談到的解決我的問題:

在MyJavaInterface類的構造函數我把代碼繞過SSL證書管理:

try{ 
    SSLContext sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(null, new TrustManager[] { new X509TrustManager() { 
     @Override 
     public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) 
     throws java.security.cert.CertificateException {;} 
     @Override 
     public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) 
     throws java.security.cert.CertificateException {;} 

     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
     return new java.security.cert.X509Certificate[] {}; } 
    }}, null); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 
}catch (Exception e) {;} 

public void myMethod(String myHtml)每個<img src=發現我使用「src」中的內容調用以下代碼:

private String getImg(String src) { 
     CookieSyncManager cookieSyncManager = 
       CookieSyncManager.createInstance(view.getContext()); 
     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setAcceptCookie(true); 
     cookieSyncManager.sync(); 
     InputStream in = null; 
     ByteArrayOutputStream out = null; 
     HttpsURLConnection con = null; 
     try { 
      String cookies = CookieManager.getInstance().getCookie(Constants.HOME_PAGE+src); 
      URL url = new URL(Constants.HOME_PAGE+src); 
      con = (HttpsURLConnection) url.openConnection(); 
      con.setRequestProperty("Cookie", cookies); 
      con.setDoInput(true); 
      con.connect(); 
      in = new BufferedInputStream(con.getInputStream()); 
      out = new ByteArrayOutputStream(); 
      int c; 
      while ((c = in.read()) != -1) 
       out.write(c); 
      out.flush(); 
      out.close(); 
      return "data:image/jpeg;base64," + 
      Base64.encodeToString(out.toByteArray(), Base64.DEFAULT); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } finally { 
      try{con.disconnect();} catch (Exception e) {;} 
      try{in.close();} catch (Exception e) {;} 
      try{out.close();} catch (Exception e) {;}  
     } 
    } 

,所以我代替SRC與由GETIMG˚F返回的一個內容結。