2017-01-09 12 views
10

मेरे ऐप में WebView है जो एक आईफ़्रेम के साथ एक साधारण HTML पृष्ठ लोड करता है जिसका उपयोग पार्टनर कंपनी से भुगतान प्रक्रिया के लिए यूआरएल लोड करने के लिए किया जाता है (और मेरे पास उस यूआरएल स्रोत तक कोई पहुंच नहीं है)।targetSdkVersion के साथ वेबव्यू में त्रुटि 24

जब मैं targetSdkVersion से 1 9 तक इंगित करता हूं तो सबकुछ ठीक काम करता है और मैं आईफ्रेम के माध्यम से भुगतान कर सकता हूं। हालांकि, जब targetSdkVersion 24 की ओर इशारा किया गया है तो मेरे पास एक ही भाग्य नहीं है।

उस मामले में, WebView iFrame जो क्रेडिट कार्ड की जानकारी और इसे प्रस्तुत करने के लिए एक Button साथ प्रवेश करने के लिए कुछ EditText दिखाया गया है लोड करने के लिए प्रबंधन करता है, लेकिन जब मैं उस बटन पर क्लिक करें मैं हमेशा एक त्रुटि 500 ​​है।

चूंकि भुगतान यूआरएल आउटसोर्स किया गया है, इसलिए मैं 500 साझेदार से उत्पत्ति को जानने के लिए हमारी साझेदार कंपनी पहुंचा। और उन्होंने मुझे बताया कि त्रुटि एक डबल कॉल से आती है जो मुझे लगता है कि एपीआई 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 साथी कंपनी के URL से बदला है और मैं इसे प्रभावी रूप से bellow मिलती है:

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

निकालें इस लाइन और, एपीआई 24 में जाँच करता है, तो (Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled (सही); } – Nainal

+0

ऐसा नहीं है।यह लाइन ब्राउज़र के माध्यम से डीबगिंग की अनुमति देने के लिए है और केवल किटकैट और उच्चतर के लिए काम करती है। –

+0

क्या यह एपीआई 23 में काम कर रहा है? –

उत्तर

2

कुछ हफ्तों के बाद, मैं इस https://developer.android.com/about/versions/android-5.0-changes.html#BehaviorWebView जो एपीआई 21. के परिवर्तन बताते हैं WebView बात यह है कि कहते हैं पर एक नजर डालें पता चला:

आपके आवेदन एपीआई स्तर 21 या बाद के साथ काम करता है:

  • सिस्टम डिफ़ॉल्ट रूप से मिश्रित सामग्री और तृतीय-पक्ष कुकीज को लॉक करता है। करने के लिए मिश्रित सामग्री और तीसरे पक्ष के कुकीज़) क्रमशः अनुमति देते हैं, तरीकों
    setMixedContentMode() और setAcceptThirdPartyCookies (का उपयोग करें।

तो, मैंने केवल इन कॉन्फ़िगरेशन को WebView में जोड़ा और यह पूरी तरह से काम किया।

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

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

} 
+0

यूप ने उत्तर देने जा रहा था एंड्रॉइड ने अपनी सुरक्षा नीतियों को अपग्रेड कर दिया है, लेकिन आपका उत्तर मिला जो वास्तव में मेरा मुद्दा था। –

संबंधित मुद्दे