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 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:
> 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 :
final String proxyHost = android.net.Proxy.getDefaultHost();
final int proxyPort = android.net.Proxy.getDefaultPort();
Puis...
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 :
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
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
Vous devez être identifié pour poster un commentaire.
Nicolas DRUET
| Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 |
Copyright © 2000-2012 - www.developpez.com