如何以编程方式设置http代理?

时间:2010-09-02 17:35:32

标签: android

我正在寻找一种以编程方式设置Android手机的http代理设置。我已经尝试使用android.provider.Settings.System.putString()来设置System.HTTP_PROXY,但是我的调用失败了(我现在使用的是2.2仿真器图像)。我的代码如下:

if (System.putString(getContentResolver(), System.HTTP_PROXY, "10.10.2.1:8080")) {
    tv.append("put for HTTP_PROXY succeeded.\n");
}
else {
    tv.append("put for HTTP_PROXY failed.\n");
}

我还添加到我的Android清单中:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

..虽然从文档中不清楚哪些是必需的,但如果需要的话。

我熟悉this SO thread,但其中的技术需要手动adb命令,这些命令需要SDK工具和(可能)根电话。

有没有办法实现这个目标?理想情况下,我想要设置一个将用于数据和wifi连接的http代理。

6 个答案:

答案 0 :(得分:15)

这不可能作为第三方应用程序执行此操作。你收到这条消息:

12-07 12:39:37.736: W/PackageManager(85): Not granting permission android.permission.WRITE_SECURE_SETTINGS to package com.mgranja.xxxxxxx (protectionLevel=3 flags=0xbe46)

只有使用与系统应用程序相同的密钥签名的应用才能获得此权限(例如:如果您自己制作rom,则可以添加该功能)

有关此问题的权限级别的更多信息,特别是adamk的答案。

Why are these permissions being refused?

答案 1 :(得分:12)

如果您将代理的使用限制在自己的应用程序中,则可以使用ProxyProxySelector API。

答案 2 :(得分:3)

设置代理检查Mike的答案; 以下是检索代理详细信息的代码段

public static String getProxyDetails(Context context) {
        String proxyAddress = new String();
        try {
            if (IsPreIcs()) {
                proxyAddress = android.net.Proxy.getHost(context);
                if (proxyAddress == null || proxyAddress.equals("")) {
                    return proxyAddress;
                }
                proxyAddress += ":" + android.net.Proxy.getPort(context);
            } else {
                proxyAddress = System.getProperty("http.proxyHost");
                proxyAddress += ":" + System.getProperty("http.proxyPort");
            }
        } catch (Exception ex) {
            //ignore
        }
        return proxyAddress;
    }

如果检测到某些异常或没有代理,它将返回空;

答案 3 :(得分:1)

您可以为应用程序VM设置代理,但由于安全原因,第三方应用程序可能没有设置设备代理的功能。

答案 4 :(得分:0)

您是否尝试call the com.android.settings.ProxySelector活动并让用户输入代理?它存储在全局,但似乎它不支持标准的Proxy和ProxySelector API(对于这个问题,还有另一个问题:How users/developers can set the Android's proxy configuration for versions 2.x?

答案 5 :(得分:-1)

我找到了here看起来可能有效的内容

package com.BrowserSettings;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.provider.Settings;

public class BrowserSettingsUI extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final Button button = (Button) findViewById(R.id.Button01);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                try {
                    Settings.System.putString(getContentResolver(),  
            Settings.System.HTTP_PROXY, "127.0.0.1:100");//enable proxy
                }catch (Exception ex){
                }
            }
        });

        final Button button2 = (Button) findViewById(R.id.Button02);
        button2.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                try {
                    Settings.System.putString(getContentResolver(), 
            Settings.System.HTTP_PROXY, "");//disable proxy
                }catch (Exception ex){
                }
            }
        });
    }
}

您必须添加

<uses-permission android:name=”android.permission.WRITE_SETTINGS” />

到您的清单。