要为仅限现场/内部应用程序添加代理,可以使用以下代码示例:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.util.Log;
import java.lang.reflect.Field;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.util.List;
public class ProxyHelper {
private static final String TAG = "ProxyHelper";
private static final String PROXY_HOST = "YOUR_PROXY_HOST";
private static final int PROXY_PORT = YOUR_PROXY_PORT;
public static void enableProxy(Context context) {
try {
// Set HTTP proxy
System.setProperty("http.proxyHost", PROXY_HOST);
System.setProperty("http.proxyPort", String.valueOf(PROXY_PORT));
// Set HTTPS proxy
System.setProperty("https.proxyHost", PROXY_HOST);
System.setProperty("https.proxyPort", String.valueOf(PROXY_PORT));
// Set proxy for the default ProxySelector
ProxySelector.setDefault(new ProxySelector() {
@Override
public List select(URI uri) {
return List.of(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT)));
}
@Override
public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
Log.e(TAG, "Proxy connect failed");
}
});
// Set proxy for the default Network
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
NetworkRequest networkRequest = builder.build();
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
try {
// Set proxy for the Network
Field field = network.getClass().getDeclaredField("mService");
field.setAccessible(true);
Object obj = field.get(network);
Class> cls = Class.forName("android.net.INetworkManager");
Method method = cls.getDeclaredMethod("setProxy", Network.class, ProxyInfo.class);
method.invoke(obj, network, ProxyInfo.buildDirectProxy(PROXY_HOST, PROXY_PORT, null));
} catch (Exception e) {
Log.e(TAG, "Failed to set proxy for network", e);
}
}
};
connectivityManager.registerNetworkCallback(networkRequest, networkCallback);
} catch (Exception e) {
Log.e(TAG, "Failed to enable proxy", e);
}
}
public static void disableProxy() {
// Clear HTTP proxy
System.clearProperty("http.proxyHost");
System.clearProperty("http.proxyPort");
// Clear HTTPS proxy
System.clearProperty("https.proxyHost");
System.clearProperty("https.proxyPort");
// Remove proxy for the default ProxySelector
ProxySelector.setDefault(ProxySelector.getDefault());
// Remove proxy for the default Network
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.unregisterNetworkCallback(networkCallback);
}
}
enableProxy()
方法:ProxyHelper.enableProxy(getApplicationContext());
disableProxy()
方法:ProxyHelper.disableProxy();
注意:上述示例中的 YOUR_PROXY_HOST
和 YOUR_PROXY_PORT
需要替换为实际的代理主机和端口。同时,请确保您的应用程序具有访问网络的权限。