2013-05-07 105 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返回的一个内容结。