juin
2010
C’est un peu la croix et la bannière de développer sous Eclipse derrière un proxy nécessitant une authentification avec l’émulateur d’Android. Nous allons voir ce qui est possible et ce qui ne l’est pas :
- Installation du SDK
- Spécifier le proxy à l’émulateur
- Se connecter à un serveur distant via HttpURLConnection
- Se connecter à un serveur distant via DefaultHttpClient
> Installation de l’environnement : windows, Eclipse 3.5, ADT 0.9.7 et le SDK r6
[edit du 11/06/2010 ]
Si les précédents SDK pouvaient être installés directement sans nécessiter une connexion internet, Google a décidé depuis Décembre de changer sa façon de faire. L’archive du SDK ne contient que le répertoire sdk/tools.
La plateforme Android (1.5, 1.6, 2.1 et 2.2), la documentation, les drivers USB se téléchargent via l’installateur (sdk/SDK Setup.exe). C’est une vision plus modulaire et plus pratique pour eux.
Allez dans Settings et saisissez l’adresse et le port du proxy. Cochez éventuellement Force Https.
Mais si comme moi votre Proxy nécessite une identification, et bien l’erreur 407 sera la seule donnée que vous récupérerez.
Deux solutions existent:
- La plus simple est de télécharger les composants du SDK sur une machine ayant un accès direct à internet puis de les copier/coller sur votre machine de développement.
- La seconde consiste à installer SQUID (multi-plateforme), un proxy à installer en local sur votre machine qui s’occupera d’effectuer l’authentification auprès du proxy de votre entreprise. Malheureusement je n’ai pas essayé. Mais J.S décrit la marche à suivre sur son blog : http://sastriawan.blogspot.com/2009/10/workaround-on-installing-android-sdk-20.html et sur le forum http://androidforums.com/android-developers/21088-problem-sdk-installation.html un post détaille comment faire sous Windows
> Spécifier le proxy à l’émulateur
[edit du 11/06/2010 ]
-http-proxy est une option au lancement de l’émulateur. Je n’ai jamais réussi à faire fonctionner le navigateur internet et GoogleMap avec.
Du temps du SDK 1.6, il était possible d’utiliser le navigateur en définissant l’adresse du proxy et son port en éditant un APN : Home > Menu > Settings > Wireless Controls > Mobile networks > Access Point Names
Depuis le SKD d’Android 2.0.1, 2.1 et la récente 2.2, plus rien de marche :
http://code.google.com/p/android/issues/detail?id=5508
C’est tout même absurde qu’on ne puisse pas développer correctement derrière un proxy d’entreprise.
> Se connecter à un serveur distant via HttpURLConnection
Vous pouvez récupérer les préférences de l’utilisateur :
1
2 final String proxyHost = android.net.Proxy.getDefaultHost();
final int proxyPort = android.net.Proxy.getDefaultPort();
Puis…
1
2
3
4
5
6
7
8
9
10
11
12
13 String url = "http://www.google.com/ig/api?weather=Nantes.FRANCE", username = "username ", password = "password ";
Authenticator.setDefault(new SimpleAuthenticator(username,password));
URL server = new URL(url);
Properties systemProperties = System.getProperties();
systemProperties.setProperty("http.proxyHost",proxyHost );
systemProperties.setProperty("http.proxyPort",proxyPort );
HttpURLConnection connection = (HttpURLConnection)server.openConnection();
connection.connect();
InputStream xmlGoogleWeather = connection.getInputStream()
...
La classe SimpleAuthenticator :
1
2
3
4
5
6
7
8
9
10
11
12 public class SimpleAuthenticator extends Authenticator {
private String username, password;
public SimpleAuthenticator(String username, String password) {
this.username = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
}
> Se connecter à un serveur distant via DefaultHttpClient
1
2
3
4
5
6
7
8
9
10
11
12 final String proxyHost = android.net.Proxy.getDefaultHost();
final int proxyPort = android.net.Proxy.getDefaultPort();
DefaultHttpClient client = new DefaultHttpClient();
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(proxyHost , proxyPort ));
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("username:password");
client.getCredentialsProvider().setCredentials(new AuthScope(proxyHost ,proxyPort ),credentials);
HttpResponse response = client.execute(new HttpGet("http://..."));
InputStream xmlGoogleWeather = response.getEntity().getContent();
...
> Conclusion
On ne peut pas dire que Google nous facilite la tâche. Travailler derrière un proxy n’est pourtant pas si étonnant que cela en entreprise. Et cette histoire dure depuis les premières versions du SDK.
Je tiendrai à jour le post au fil de mes recherches…
> Ressources
- http://stackoverflow.com/questions/28380/proxy-with-android-emulator
- http://markmail.org/message/r2mpgv7dqaeti3zf
- http://www.coderanch.com/t/462906/Android/Mobile/connect-internet-behind-proxy
- http://groups.google.com/group/android-developers/browse_thread/thread/1105da659b20a176
- http://www.developer.com/java/other/article.php/1551421/Questions-on-HttpURLConnection-and-Proxies.htm
- http://www.rgagnon.com/javadetails/java-0085.html
- http://sastriawan.blogspot.com/2009/10/workaround-on-installing-android-sdk-20.html
Après de nombreux tests, je n’ai pas réussi à me connecter à internet via le browser de l’émulateur; le proxy nécessitant une authentification.
La gestion du proxy est enfin fonctionnelle sur le SDK android V2.2:
– en ligne de commande: emulator -avd MonAvd2.2 -http-proxy http://:
– sous Eclipse: rajouter dans le menu « Debug configuration », sous l’onglet « Target » au niveau du champ « Additional Emulator Command Line Options », l’option: -http-proxy http://:
Ex: -http-proxy http://: