如何使用WebView在Xamarin C#应用程序中为Android设置代理?
我使用Xamarin在C#中创建了一个Android应用程序 这本质上是一个具有一些附加功能的web浏览器,现在我想添加一个选项来设置要使用的代理。在应用程序中,我使用WebView连接到网站 我试图实现这个主题()中的解决方案,但WifiConfiguration中没有linkProperties。这就是它的样子:如何使用WebView在Xamarin C#应用程序中为Android设置代理?,c#,android,xamarin,webview,proxy,C#,Android,Xamarin,Webview,Proxy,我使用Xamarin在C#中创建了一个Android应用程序 这本质上是一个具有一些附加功能的web浏览器,现在我想添加一个选项来设置要使用的代理。在应用程序中,我使用WebView连接到网站 我试图实现这个主题()中的解决方案,但WifiConfiguration中没有linkProperties。这就是它的样子: private static Java.Lang.Object getField(Java.Lang.Object obj, String name) { Field f =
private static Java.Lang.Object getField(Java.Lang.Object obj, String name)
{
Field f = obj.Class.GetField(name);
Java.Lang.Object o = f.Get(obj);
return o;
}
public void SetHttpProxy(string proxyServerAddress, int proxyServerInt)
{
try
{
var wifiManager = context.GetSystemService(Context.WifiService) as WifiManager;
if (!wifiManager.IsWifiEnabled)
return;
var configurationList = wifiManager.ConfiguredNetworks;
var cur = wifiManager.ConnectionInfo.NetworkId;
var configuration = configurationList.FirstOrDefault(conf => conf.NetworkId == cur);
getField(configuration, "linkProperties");
}
catch (Exception e)
{
throw;
}
}
以下是适用于4、5、6.*和7.*Android操作系统版本的解决方案:
public static void SetProxy(WebView webView, string host, int port, bool bypass)
{
Context appContext = webView.Context.ApplicationContext;
JavaSystem.SetProperty("http.proxyHost", host);
JavaSystem.SetProperty("http.proxyPort", port + "");
JavaSystem.SetProperty("https.proxyHost", host);
JavaSystem.SetProperty("https.proxyPort", port + "");
if (bypass)
JavaSystem.SetProperty("http.nonProxyHosts", BYPASS_PATTERN);
try
{
Class applictionCls = Class.ForName(APPLICATION_CLASS_NAME);
Field loadedApkField = applictionCls.GetField("mLoadedApk");
loadedApkField.Accessible = true;
Object loadedApk = loadedApkField.Get(appContext);
Class loadedApkCls = Class.ForName("android.app.LoadedApk");
Field receiversField = loadedApkCls.GetDeclaredField("mReceivers");
receiversField.Accessible = true;
ArrayMap receivers = (ArrayMap) receiversField.Get(loadedApk);
foreach (Object receiverMap in receivers.Values())
{
foreach (Object rec in Extensions.JavaCast<ArrayMap>(receiverMap).KeySet())
{
Class clazz = rec.Class;
if (clazz.Name.Contains("ProxyChangeListener"))
{
Method onReceiveMethod = clazz.GetDeclaredMethod("onReceive", Class.FromType(typeof(Context)), Class.FromType(typeof(Intent)));
Intent intent = new Intent(Android.Net.Proxy.ProxyChangeAction);
onReceiveMethod.Invoke(rec, appContext, intent);
}
}
}
}
catch (Exception)
{
}
}
publicstaticvoidsetproxy(WebView-WebView、字符串主机、int端口、bool旁路)
{
Context-appContext=webView.Context.ApplicationContext;
SetProperty(“http.proxyHost”,host);
SetProperty(“http.proxyPort”,port+”);
SetProperty(“https.proxyHost”,主机);
SetProperty(“https.proxyPort”,port+”);
如果(旁路)
SetProperty(“http.nonProxyHosts”,绕过_模式);
尝试
{
类applictionCls=Class.ForName(应用程序类名称);
Field loadedApkField=applictionCls.GetField(“mLoadedApk”);
LoadedAppField.Accessible=true;
Object loadedApk=loadedApkField.Get(appContext);
Class loadedApkCls=Class.ForName(“android.app.LoadedApk”);
字段接收者字段=LoadedAppkCls.GetDeclaredField(“Mreceiver”);
receiversField.Accessible=true;
ArrayMap receivers=(ArrayMap)receiversField.Get(LoadedAppk);
foreach(receivers.Values()中的对象receiverMap)
{
foreach(Extensions.JavaCast(receiverMap.KeySet())中的对象rec)
{
clazz类=推荐类;
if(clazz.Name.Contains(“ProxyChangeListener”))
{
方法onReceiveMethod=clazz.GetDeclaredMethod(“onReceive”,Class.FromType(typeof(Context)),Class.FromType(typeof(Intent));
意向意向=新意向(Android.Net.Proxy.ProxyChangeAction);
调用(rec、appContext、intent);
}
}
}
}
捕获(例外)
{
}
}
@ChaitanyaKumar这是Java,而不是使用Xamarin的C。我不太懂Java,所以我不知道这个答案是否有什么可取之处。