2017-01-09 57 views
10

我的应用程序具有加载一个简单的HTML页面与被用于从一个合作伙伴公司的加载过程中支付的URL的iFrame一个WebView(和我有到该URL源没有访问权限)。错误网页视图与targetSdkVersion 24

当我点targetSdkVersion至19一切工作正常,我可以通过iframe进行支付。但是,当targetSdkVersion指向24时,我没有相同的运气。

在这种情况下,WebView管理加载其显示一些EditText,以信用卡信息和Button提交它进入的iFrame,但是当我点击该按钮,我一直有一个错误500。

由于支付网址是外包的,我达到了我们的合作伙伴公司结识来自500错误的origem。他们告诉我,错误来自双重电话,这使得我认为从API 24的WebView是这样做的。

500错误的打印: enter image description here

HTML文件payment_html如下:

<html> 
    <head> 
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 
    </head> 

    <body id="bodyContent" onload="addListener()" style="margin:0px;padding:0px;overflow:hidden;height:355px"> 
     <iframe id="ifrPagamento" src="partner_url" 
      frameborder="0" style="overflow:hidden;width:100%;height:100%"></iframe> 
    </body> 

    <script type="text/javascript"> 

     function addListener() { 
      window.addEventListener("message", receiveMessage, false); 
     } 

     function receiveMessage(message) { 

      if (message) { 

       var data = JSON.parse(message.data); 

       if (data.code) { 

        if(data.code === "0") { 
         app.returnStatus(0); 
        } 
        else { 
         app.returnStatus(1); 
        } 
       } 

      } 

     } 

    </script> 
</html> 

partner_url是由合作伙伴公司的网址替换,我明白了动态波纹管:

private void loadPage() { 

    String url = (String) Session.getObject(Session.Key.PARTNER_URL, ""); 

    InputStream inputStream = mActivity.getResources().openRawResource(R.raw.payment_html); 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    try { 

     int i = inputStream.read(); 

     while (i != -1) { 

      byteArrayOutputStream.write(i); 
      i = inputStream.read(); 

     } 

     inputStream.close(); 

     String html = byteArrayOutputStream.toString(); 
     html = html.replace("partner_url", url); 

     mWebView.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); 

    } catch (IOException e) { 

     Funcoes.printError(e.getMessage()); 

    } 

} 

我将WebView设置为喜欢以下内容:

private void setupWebView() { 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     WebView.setWebContentsDebuggingEnabled(true); 
    } 

    WebSettings webSettings = mWebView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setSupportMultipleWindows(true); 
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true); 
    webSettings.setUseWideViewPort(true); 
    webSettings.setLoadWithOverviewMode(true); 
    webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); 
    webSettings.setAllowUniversalAccessFromFileURLs(true); 
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); 
    webSettings.setAppCacheEnabled(false); 
    webSettings.setDomStorageEnabled(true); 

    mWebView.setWebChromeClient(new WebChromeClient()); 
    mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    mWebView.addJavascriptInterface(new MyJavaScriptInterface(mActivity), "app"); 

    mWebView.setWebViewClient(new WebViewClient() { 

     @SuppressWarnings("deprecation") 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
      view.loadUrl(request.getUrl().toString()); 
      return true; 
     } 

    }); 

} 

最后的layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="10dp" 
    android:paddingBottom="10dp" 
    android:background="@color/white"> 

    <WebView 
     android:id="@+id/webView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scrollbars="none"> 

    </WebView> 

    <ProgressBar 
     android:id="@+id/progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:visibility="gone"/> 

</RelativeLayout> 

正如我以前说过,我不知道该网址的来源,因为它是外包。所以我不能分享它。

我一直在努力解决这个问题几个星期。谁能帮我?

+0

删除此行,并检查在API 24中,如果(Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT){ WebView.setWebContentsDebuggingEnabled(真); } – Nainal

+0

这不是。该行只是为了允许通过浏览器进行调试,并且仅适用于KITKAT及更高版本。 –

+0

它在api 23中工作吗? –

回答

2

几个星期之后,我发现这个https://developer.android.com/about/versions/android-5.0-changes.html#BehaviorWebView这也解释了API 21的变化看一看的WebView部分,上面写着:

如果您的应用程序使用API​​级别21或更高版本:

  • 系统锁定默认为混合内容和第三方的cookies。为了 允许混合的内容和第三方Cookie,使用的方法
    setMixedContentMode()和setAcceptThirdPartyCookies(),分别。

所以,我只将这些配置添加到WebView,它的工作完美。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

    webSettings.setMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW); 
    CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true); 

} 
+0

烨正想回答Android已经升级了其安全策略,却发现你的答案这正是我的观点。 –