Как можно запрограммировать прокси-сервер http?

Я ищу программный способ настройки параметров http-прокси для телефонов Android. Я попытался использовать 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" />

.. хотя из документов не видно, какое разрешение требуется, если таковое требуется.

Я знаком с этим SO-нитью, но для этого метода требуются ручные команды adb, для которых требуются инструменты SDK и (возможно) корневой телефон.

Есть ли способ сделать это? В идеале, мне бы хотелось установить HTTP-прокси, который будет использоваться для соединений данных и Wi-Fi.

Ответ 1

Невозможно сделать это как стороннее приложение. Вы получите это сообщение:

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)

Только те приложения, которые подписаны с тем же ключом, что и системные приложения, могут получить это разрешение (т.е.: если вы готовите свой собственный ром, вы можете добавить эту функциональность)

Дополнительная информация о уровнях разрешений по этому вопросу, особенно ответ adamk.

Зачем отказывать эти разрешения?

Ответ 2

Если вы ограничиваете использование прокси в своем приложении, вы можете использовать Proxy и ProxySelector API.

Ответ 3

Чтобы установить проверку прокси-сервера, ответьте Майку; Ниже приведен фрагмент кода для получения сведений о прокси-сервере.

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;
    }

Он будет возвращать пустой, если обнаружено какое-либо исключение или не обнаружено прокси-сервера;

Ответ 4

Вы можете установить прокси для своей прикладной VM, но из-за соображений безопасности сторонние приложения могут не иметь возможности устанавливать прокси-сервер устройства.

Ответ 5

Вы пытались выполнить call the com.android.settings.ProxySelector активность и позволить пользователю вводить прокси? Он хранится глобально, но, похоже, он не поддерживает стандартный API Proxy и ProxySelector (для этой проблемы возникает еще один вопрос: Как пользователи/разработчики могут установить конфигурацию прокси-сервера Android для версий 2.х?)

Ответ 6

Я нашел что-то здесь, похоже, что он может работать

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" />

к вашему манифесту.