Как можно запрограммировать прокси-сервер 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" />
к вашему манифесту.