दिलचस्प पोस्ट
अंगुलियों 2 में * ngFor का उपयोग करके को पुनरावृति कैसे करें TypeError: अनुपस्थित 1 आवश्यक स्थितिगत तर्क: 'स्व' एसएसआरएस से निर्यात किए गए पीडीएफ़ में रिक्त पृष्ठों से छुटकारा पाने के तरीके कस्टम डायलॉग को एनिमेट करें यूनिकोडडेकोड एर्रर: 'एएससीआई' कोडेक स्थिति 1 में बाइट 0x एफ डीकोड नहीं कर सकता सी ++ में एक्सटर्न का उपयोग कब करें अतुल्यकालिक कॉलबैक फ़ंक्शन के सेट के लिए मैं कैसे प्रतीक्षा कर सकता हूं? एमवीपी और एमवीसी क्या हैं और अंतर क्या है? जिंजरब्रेड पर चलाए गए एप्लिकेशन के लिए MODIFY_PHONE_STATE की अनुमति कैसे दी जाए IE में किसी भी व्यक्ति को HTML पर सेट नहीं किया जा सकता आईपैड चित्र और लैंडस्केप मोड के लिए आकार देने वर्ग सी ++: एक खाली वर्ग के ऑब्जेक्ट का आकार क्या है? समूहीकृत SQL परिणामों के प्रत्येक समूह के लिए अधिकतम मूल्य के साथ रिकॉर्ड प्राप्त करें एंड्रॉइड के लिए एक्लिप्स में प्रोगुर्ड को सक्षम करना एंड्रॉइड के साथ एक HTTP अनुरोध करें

WebView एंड्रॉइड प्रॉक्सी

मुझे पता है कि कैसे प्रॉक्सी मैन्युअल रूप से सेट करने के लिए और यह मेरे WebView में उपयोग करने के लिए।

सेटिंग्स -> वायरलेस नेटवर्क -> मोबाइल नेटवर्क-> एक्सेस प्वाइंट नाम-> टेलिकिया अब प्रॉक्सी सर्वर पता और पोर्ट दर्ज करें (जो कि 80 होगा)। WebView.enablePlatformNotifications ();

लेकिन क्या मैं कोड से प्रॉक्सी सेटिंग सेट कर सकता हूं? तो मेरे उपयोगकर्ता को मैन्युअल रूप से सेट नहीं करना पड़ेगा?

धन्यवाद

वेब के समाधान से एकत्रित समाधान "WebView एंड्रॉइड प्रॉक्सी"

आपकी वेबवॉव प्रॉक्सी सेटिंग्स को प्रोग्रामेटिक रूप से बदलने का कोई कानूनी तरीका नहीं है। लेकिन android.net.http.RequestQueue वर्ग से mProxyHost मान को बदलने के लिए जावा प्रतिबिंब का उपयोग करना संभव है। यह निजी मूल्य है और उसके लिए कोई सेटर्स नहीं है, इसलिए प्रतिबिंब केवल एक ही संभावित संस्करण लगता है। मैंने इसे अपने प्रोजेक्ट में इस्तेमाल किया और यह काम करता है यहाँ मेरी विधि का नमूना है:

private boolean setProxyHostField(HttpHost proxyServer) { // Getting network Class networkClass = null; Object network = null; try { networkClass = Class.forName("android.webkit.Network"); Field networkField = networkClass.getDeclaredField("sNetwork"); network = getFieldValueSafely(networkField, null); } catch (Exception ex) { Log.e(ProxyManager.class.getName(), "error getting network"); return false; } if (network == null) { Log.e(ProxyManager.class.getName(), "error getting network : null"); return false; } Object requestQueue = null; try { Field requestQueueField = networkClass .getDeclaredField("mRequestQueue"); requestQueue = getFieldValueSafely(requestQueueField, network); } catch (Exception ex) { Log.e(ProxyManager.class.getName(), "error getting field value"); return false; } if (requestQueue == null) { Log.e(ProxyManager.class.getName(), "Request queue is null"); return false; } Field proxyHostField = null; try { Class requestQueueClass = Class.forName("android.net.http.RequestQueue"); proxyHostField = requestQueueClass .getDeclaredField("mProxyHost"); } catch (Exception ex) { Log.e(ProxyManager.class.getName(), "error getting proxy host field"); return false; } synchronized (synchronizer) { boolean temp = proxyHostField.isAccessible(); try { proxyHostField.setAccessible(true); proxyHostField.set(requestQueue, proxyServer); } catch (Exception ex) { Log.e(ProxyManager.class.getName(), "error setting proxy host"); } finally { proxyHostField.setAccessible(temp); } } return true; } private Object getFieldValueSafely(Field field, Object classInstance) throws IllegalArgumentException, IllegalAccessException { boolean oldAccessibleValue = field.isAccessible(); field.setAccessible(true); Object result = field.get(classInstance); field.setAccessible(oldAccessibleValue); return result; } 

मैंने यहां प्रस्तुत तीन समाधानों को अनुकूलित किया है (एंड्रॉइड के सभी संस्करणों के लिए काम करने वाली एक एकल, सरल सेटप्रोक्सी विधि का उत्पादन करने के लिए) मैंने इसे 10 से 18 तक परीक्षण किया है, और यह सभी परीक्षण वातावरणों के लिए काम करता है

नवीनीकृत 2014-04-04 आखिरकार मैंने समाधान में नीचे दी गई टिप्पणी से काम किया, सौभाग्य से नुबेला और xjy2061 अब यह किटकैट 4.4 सहित सभी मौजूदा Android संस्करणों के लिए काम करता है। यदि आप अपना स्वयं का अनुप्रयोग उप-वर्ग लागू करते हैं, तो वैकल्पिक चौथे पैरामीटर के रूप में कक्षा का नाम प्रदान करें।

नवीनीकृत 2015-01-15 किटकैट विधि में वैकल्पिक लेबल वाला भाग लॉलीपॉप पर एक अपवाद फेंकता है क्योंकि एक सहायक वर्ग अनुपलब्ध है, लेकिन इसके बिना यह किटकैट और लॉलीपॉप दोनों पर काम करता है, क्योंकि वेबव्यू दोनों ही मामलों में क्रोमियम पर आधारित है।

 public static boolean setProxy(WebView webview, String host, int port, String applicationClassName="android.app.Application") { // 3.2 (HC) or lower if (Build.VERSION.SDK_INT <= 13) { return setProxyUpToHC(webview, host, port); } // ICS: 4.0 else if (Build.VERSION.SDK_INT <= 15) { return setProxyICS(webview, host, port); } // 4.1-4.3 (JB) else if (Build.VERSION.SDK_INT <= 18) { return setProxyJB(webview, host, port); } // 4.4 (KK) & 5.0 (Lollipop) else { return setProxyKKPlus(webview, host, port, applicationClassName); } } /** * Set Proxy for Android 3.2 and below. */ @SuppressWarnings("all") private static boolean setProxyUpToHC(WebView webview, String host, int port) { Log.d(LOG_TAG, "Setting proxy with <= 3.2 API."); HttpHost proxyServer = new HttpHost(host, port); // Getting network Class networkClass = null; Object network = null; try { networkClass = Class.forName("android.webkit.Network"); if (networkClass == null) { Log.e(LOG_TAG, "failed to get class for android.webkit.Network"); return false; } Method getInstanceMethod = networkClass.getMethod("getInstance", Context.class); if (getInstanceMethod == null) { Log.e(LOG_TAG, "failed to get getInstance method"); } network = getInstanceMethod.invoke(networkClass, new Object[]{webview.getContext()}); } catch (Exception ex) { Log.e(LOG_TAG, "error getting network: " + ex); return false; } if (network == null) { Log.e(LOG_TAG, "error getting network: network is null"); return false; } Object requestQueue = null; try { Field requestQueueField = networkClass .getDeclaredField("mRequestQueue"); requestQueue = getFieldValueSafely(requestQueueField, network); } catch (Exception ex) { Log.e(LOG_TAG, "error getting field value"); return false; } if (requestQueue == null) { Log.e(LOG_TAG, "Request queue is null"); return false; } Field proxyHostField = null; try { Class requestQueueClass = Class.forName("android.net.http.RequestQueue"); proxyHostField = requestQueueClass .getDeclaredField("mProxyHost"); } catch (Exception ex) { Log.e(LOG_TAG, "error getting proxy host field"); return false; } boolean temp = proxyHostField.isAccessible(); try { proxyHostField.setAccessible(true); proxyHostField.set(requestQueue, proxyServer); } catch (Exception ex) { Log.e(LOG_TAG, "error setting proxy host"); } finally { proxyHostField.setAccessible(temp); } Log.d(LOG_TAG, "Setting proxy with <= 3.2 API successful!"); return true; } @SuppressWarnings("all") private static boolean setProxyICS(WebView webview, String host, int port) { try { Log.d(LOG_TAG, "Setting proxy with 4.0 API."); Class jwcjb = Class.forName("android.webkit.JWebCoreJavaBridge"); Class params[] = new Class[1]; params[0] = Class.forName("android.net.ProxyProperties"); Method updateProxyInstance = jwcjb.getDeclaredMethod("updateProxy", params); Class wv = Class.forName("android.webkit.WebView"); Field mWebViewCoreField = wv.getDeclaredField("mWebViewCore"); Object mWebViewCoreFieldInstance = getFieldValueSafely(mWebViewCoreField, webview); Class wvc = Class.forName("android.webkit.WebViewCore"); Field mBrowserFrameField = wvc.getDeclaredField("mBrowserFrame"); Object mBrowserFrame = getFieldValueSafely(mBrowserFrameField, mWebViewCoreFieldInstance); Class bf = Class.forName("android.webkit.BrowserFrame"); Field sJavaBridgeField = bf.getDeclaredField("sJavaBridge"); Object sJavaBridge = getFieldValueSafely(sJavaBridgeField, mBrowserFrame); Class ppclass = Class.forName("android.net.ProxyProperties"); Class pparams[] = new Class[3]; pparams[0] = String.class; pparams[1] = int.class; pparams[2] = String.class; Constructor ppcont = ppclass.getConstructor(pparams); updateProxyInstance.invoke(sJavaBridge, ppcont.newInstance(host, port, null)); Log.d(LOG_TAG, "Setting proxy with 4.0 API successful!"); return true; } catch (Exception ex) { Log.e(LOG_TAG, "failed to set HTTP proxy: " + ex); return false; } } /** * Set Proxy for Android 4.1 - 4.3. */ @SuppressWarnings("all") private static boolean setProxyJB(WebView webview, String host, int port) { Log.d(LOG_TAG, "Setting proxy with 4.1 - 4.3 API."); try { Class wvcClass = Class.forName("android.webkit.WebViewClassic"); Class wvParams[] = new Class[1]; wvParams[0] = Class.forName("android.webkit.WebView"); Method fromWebView = wvcClass.getDeclaredMethod("fromWebView", wvParams); Object webViewClassic = fromWebView.invoke(null, webview); Class wv = Class.forName("android.webkit.WebViewClassic"); Field mWebViewCoreField = wv.getDeclaredField("mWebViewCore"); Object mWebViewCoreFieldInstance = getFieldValueSafely(mWebViewCoreField, webViewClassic); Class wvc = Class.forName("android.webkit.WebViewCore"); Field mBrowserFrameField = wvc.getDeclaredField("mBrowserFrame"); Object mBrowserFrame = getFieldValueSafely(mBrowserFrameField, mWebViewCoreFieldInstance); Class bf = Class.forName("android.webkit.BrowserFrame"); Field sJavaBridgeField = bf.getDeclaredField("sJavaBridge"); Object sJavaBridge = getFieldValueSafely(sJavaBridgeField, mBrowserFrame); Class ppclass = Class.forName("android.net.ProxyProperties"); Class pparams[] = new Class[3]; pparams[0] = String.class; pparams[1] = int.class; pparams[2] = String.class; Constructor ppcont = ppclass.getConstructor(pparams); Class jwcjb = Class.forName("android.webkit.JWebCoreJavaBridge"); Class params[] = new Class[1]; params[0] = Class.forName("android.net.ProxyProperties"); Method updateProxyInstance = jwcjb.getDeclaredMethod("updateProxy", params); updateProxyInstance.invoke(sJavaBridge, ppcont.newInstance(host, port, null)); } catch (Exception ex) { Log.e(LOG_TAG,"Setting proxy with >= 4.1 API failed with error: " + ex.getMessage()); return false; } Log.d(LOG_TAG, "Setting proxy with 4.1 - 4.3 API successful!"); return true; } // from https://stackoverflow.com/questions/19979578/android-webview-set-proxy-programatically-kitkat @SuppressLint("NewApi") @SuppressWarnings("all") private static boolean setProxyKKPlus(WebView webView, String host, int port, String applicationClassName) { Log.d(LOG_TAG, "Setting proxy with >= 4.4 API."); Context appContext = webView.getContext().getApplicationContext(); System.setProperty("http.proxyHost", host); System.setProperty("http.proxyPort", port + ""); System.setProperty("https.proxyHost", host); System.setProperty("https.proxyPort", port + ""); try { Class applictionCls = Class.forName(applicationClassName); Field loadedApkField = applictionCls.getField("mLoadedApk"); loadedApkField.setAccessible(true); Object loadedApk = loadedApkField.get(appContext); Class loadedApkCls = Class.forName("android.app.LoadedApk"); Field receiversField = loadedApkCls.getDeclaredField("mReceivers"); receiversField.setAccessible(true); ArrayMap receivers = (ArrayMap) receiversField.get(loadedApk); for (Object receiverMap : receivers.values()) { for (Object rec : ((ArrayMap) receiverMap).keySet()) { Class clazz = rec.getClass(); if (clazz.getName().contains("ProxyChangeListener")) { Method onReceiveMethod = clazz.getDeclaredMethod("onReceive", Context.class, Intent.class); Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION); onReceiveMethod.invoke(rec, appContext, intent); } } } Log.d(LOG_TAG, "Setting proxy with >= 4.4 API successful!"); return true; } catch (ClassNotFoundException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString(); Log.v(LOG_TAG, e.getMessage()); Log.v(LOG_TAG, exceptionAsString); } catch (NoSuchFieldException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString(); Log.v(LOG_TAG, e.getMessage()); Log.v(LOG_TAG, exceptionAsString); } catch (IllegalAccessException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString(); Log.v(LOG_TAG, e.getMessage()); Log.v(LOG_TAG, exceptionAsString); } catch (IllegalArgumentException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString(); Log.v(LOG_TAG, e.getMessage()); Log.v(LOG_TAG, exceptionAsString); } catch (NoSuchMethodException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString(); Log.v(LOG_TAG, e.getMessage()); Log.v(LOG_TAG, exceptionAsString); } catch (InvocationTargetException e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); String exceptionAsString = sw.toString(); Log.v(LOG_TAG, e.getMessage()); Log.v(LOG_TAG, exceptionAsString); } return false; } private static Object getFieldValueSafely(Field field, Object classInstance) throws IllegalArgumentException, IllegalAccessException { boolean oldAccessibleValue = field.isAccessible(); field.setAccessible(true); Object result = field.get(classInstance); field.setAccessible(oldAccessibleValue); return result; } 

मैंने बहुत सारे परीक्षण किए हैं और मैं कह सकता हूं कि एंड्रॉइड पर आधारित ओवरराइड का उपयोग करते हुए पिछले प्रतिक्रिया। Html.RequestQueue 1.6 से 3.1 के बीच पूरी तरह से काम करता है।

लेकिन एपीआई पर एक कोड रिफैक्टरिंग किया गया था और इसे एंड्रॉइड 3.2 और 4.x पर काम करने के लिए, यहां समाधान:

 try { Class jwcjb = Class.forName("android.webkit.JWebCoreJavaBridge"); Class params[] = new Class[1]; params[0] = Class.forName("android.net.ProxyProperties"); Method updateProxyInstance = jwcjb.getDeclaredMethod("updateProxy", params); Class wv = Class.forName("android.webkit.WebView"); Field mWebViewCoreField = wv.getDeclaredField("mWebViewCore"); Object mWebViewCoreFieldIntance = getFieldValueSafely(mWebViewCoreField, oauthPage); Class wvc = Class.forName("android.webkit.WebViewCore"); Field mBrowserFrameField = wvc.getDeclaredField("mBrowserFrame"); Object mBrowserFrame = getFieldValueSafely(mBrowserFrameField, mWebViewCoreFieldIntance); Class bf = Class.forName("android.webkit.BrowserFrame"); Field sJavaBridgeField = bf.getDeclaredField("sJavaBridge"); Object sJavaBridge = getFieldValueSafely(sJavaBridgeField, mBrowserFrame); Class ppclass = Class.forName("android.net.ProxyProperties"); Class pparams[] = new Class[3]; pparams[0] = String.class; pparams[1] = int.class; pparams[2] = String.class; Constructor ppcont = ppclass.getConstructor(pparams); updateProxyInstance.invoke(sJavaBridge, ppcont.newInstance("my.proxy.com", 1234, null)); } catch (Exception ex) { } 

का आनंद लें

के रूप में @ कार्तिक ने कहा, ये जवाब एंड्रॉइड 4.4 (किटकेट) पर काम नहीं कर रहे हैं। किटकैट के लिए यहां जवाब दिया गया था।

यह संस्करण 4.1 और 4.2 के लिए कोड है –

 /** * Set Proxy for Android 4.1 and above. */ public static boolean setProxyICSPlus(WebView webview, String host, int port, String exclusionList) { Log.d("", "Setting proxy with >= 4.1 API."); try { Class wvcClass = Class.forName("android.webkit.WebViewClassic"); Class wvParams[] = new Class[1]; wvParams[0] = Class.forName("android.webkit.WebView"); Method fromWebView = wvcClass.getDeclaredMethod("fromWebView", wvParams); Object webViewClassic = fromWebView.invoke(null, webview); Class wv = Class.forName("android.webkit.WebViewClassic"); Field mWebViewCoreField = wv.getDeclaredField("mWebViewCore"); Object mWebViewCoreFieldIntance = getFieldValueSafely(mWebViewCoreField, webViewClassic); Class wvc = Class.forName("android.webkit.WebViewCore"); Field mBrowserFrameField = wvc.getDeclaredField("mBrowserFrame"); Object mBrowserFrame = getFieldValueSafely(mBrowserFrameField, mWebViewCoreFieldIntance); Class bf = Class.forName("android.webkit.BrowserFrame"); Field sJavaBridgeField = bf.getDeclaredField("sJavaBridge"); Object sJavaBridge = getFieldValueSafely(sJavaBridgeField, mBrowserFrame); Class ppclass = Class.forName("android.net.ProxyProperties"); Class pparams[] = new Class[3]; pparams[0] = String.class; pparams[1] = int.class; pparams[2] = String.class; Constructor ppcont = ppclass.getConstructor(pparams); Class jwcjb = Class.forName("android.webkit.JWebCoreJavaBridge"); Class params[] = new Class[1]; params[0] = Class.forName("android.net.ProxyProperties"); Method updateProxyInstance = jwcjb.getDeclaredMethod("updateProxy", params); updateProxyInstance.invoke(sJavaBridge, ppcont.newInstance(host, port, exclusionList)); } catch (Exception ex) { Log.e("","Setting proxy with >= 4.1 API failed with error: " + ex.getMessage()); return false; } Log.d("", "Setting proxy with >= 4.1 API successful!"); return true; } 

बनाये का समाधान https://gist.github.com/madeye/2297083 स्यूडोकोड:

 android.webkit.Network.getInstance().mRequestQueue.mProxyHost=new HttpHost(host, port, "http") //sdk < 14 android.webkit.WebViewCore.sendStaticMessage(new android.net.ProxyProperties(...)) //sdk >= 14 

फ़र्डी के उत्तर ( वेबविवे एंड्रॉइड प्रॉक्सी ) की तुलना में बेहतर है छद्मोकोड:

 android.webkit.Network.sNetwork.mRequestQueue.mProxyHost=new HttpHost(host, port, "http") //sdk < 14 

और Guillaume13 के माध्यम से और MediumOne का जवाब ( WebView एंड्रॉइड प्रॉक्सी ) स्यूडोकोड:

 android.webkit.JWebCoreJavaBridge.updateProxy(android.webkit.WebViewClassic.fromWebView(webview).mWebViewCore.mBrowserFrame.sJavaBridge, new android.net.ProxyProperties(...)) //sdk >= 14 

लेकिन मुझे नहीं पता कि प्रॉक्सी की सफलता केवल जब मैं setProxy से पहले दो पंक्तियाँ डालता हूं:

 webview1.loadUrl("http://0.0.0.0"); try {Thread.sleep(100);} catch (Exception e) {} ProxySettings.setProxy(getApplicationContext(), "192.168.0.109", 8081); webview1.loadUrl("http://www.google.com/index.php"); 

सबसे पहले, आप सबको प्रॉक्सी सेटिंग्स फिक्स करने के लिए पोस्ट कोड के लिए धन्यवाद, जो इसे एंड्रॉइड में बदलने के लिए सार्वजनिक एपीआई मौजूद नहीं है, इससे भी मुझे बहुत मदद मिली है मैंने सभी संस्करणों में एंड्रॉइड के मुद्दों को कवर किया है कि यह इस जानकारी को अपडेट करने की आवश्यकता होगी। ऊपर जिमी के सारांश उत्तर पर निर्भर (धन्यवाद!), मैंने परीक्षण किया कि एंड्रॉइड वर्जन 3.0 पर 3.1 – 3.1 चल रहा है और एंड्रॉइड के जरिए चल रहा है। प्रॉक्सी प्रॉपर्टीज समर्थित नहीं है और विधि अद्यतन प्रोक्सिफ़िकेशन की आवश्यकता केवल पास जावा द्वारा ही है । lang.String इनपुट पैरामीटर इसलिए, मैंने अपने कोड को रास्ते से बदल दिया है, आशा है कि इससे लोगों की समान समस्या मेरे जैसा होगा:

 /** * Set Proxy from 3.0.x - to 3.1.x API. * @param webview webview webview to apply proxy * @param host host name of proxy server * @param port port of proxy server * @return true/false if success or not */ private static boolean setProxyOnlyHC30to31(WebView webview, String host, int port) { try { Logger.d(ProxySettings.class, "Setting proxy from 3.0.x - 3.1.x API."); Class jwcjb = Class.forName("android.webkit.JWebCoreJavaBridge"); Class params[] = new Class[1]; params[0] = Class.forName("java.lang.String"); Method updateProxyInstance = jwcjb.getDeclaredMethod("updateProxy", params); Class wv = Class.forName("android.webkit.WebView"); Field mWebViewCoreField = wv.getDeclaredField("mWebViewCore"); Object mWebViewCoreFieldInstance = getFieldValueSafely(mWebViewCoreField, webview); Class wvc = Class.forName("android.webkit.WebViewCore"); Field mBrowserFrameField = wvc.getDeclaredField("mBrowserFrame"); Object mBrowserFrame = getFieldValueSafely(mBrowserFrameField, mWebViewCoreFieldInstance); Class bf = Class.forName("android.webkit.BrowserFrame"); Field sJavaBridgeField = bf.getDeclaredField("sJavaBridge"); Object sJavaBridge = getFieldValueSafely(sJavaBridgeField, mBrowserFrame); updateProxyInstance.invoke(sJavaBridge, "http://" + host + ":" + port); Logger.d(ProxySettings.class, "Setting proxy from 3.0.x - 3.1.x API successful!"); return true; } catch (Exception ex) { if (Helper.DEBUG) Logger.e(ProxySettings.class, "failed to set HTTP proxy: " + ex); return false; } }