web-dev-qa-db-fra.com

FileNotFoundException pour HttpURLConnection dans Ice Cream Sandwich

J'ai une application Android qui fonctionne bien avec Android 2.x et 3.x, mais elle échoue lorsqu'elle est exécutée sur Android 4.x.

Le problème est dans cette section de code:

URL url = new URL("http://blahblah.blah/somedata.xml");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();

InputStream inputStream = urlConnection.getInputStream();

Lorsque l'application s'exécute sur Android 4.x, l'appel getInputStream() entraîne un FileNotFoundException. Lorsque le même binaire s'exécute sur des versions antérieures d'Android, il réussit. Les URL fonctionnent également correctement dans les navigateurs Web et avec curl.

Apparemment, quelque chose à propos de HttpURLConnection a changé dans ICS. Quelqu'un a-t-il une idée de ce qui a changé et/ou de ce que pourrait être le correctif?

44
Kristopher Johnson

Essayez de supprimer l'appel setDoOutput. Tiré de ce blog: n blog

Modifier: Ceci est nécessaire lors de l'utilisation d'un appel POST.

96
reuscam

Une FileNotFoundException peut également être levée si le serveur renvoie un mauvais code d'erreur (par exemple 400 ou 401). Vous pouvez gérer cela comme suit:

int responseCode = con.getResponseCode(); //can call this instead of con.connect()
if (responseCode >= 400 && responseCode <= 499) {
    throw new Exception("Bad authentication status: " + responseCode); //provide a more meaningful exception message
}
else {
    InputStream in = con.getInputStream();
    //etc...
}
28

Je ne sais pas pourquoi, mais le traitement manuel de la redirection résout le problème.

connection.setInstanceFollowRedirects(false);
5
Kirill Kulakov

Un peu en retard mais vous pouvez également vérifier le contenu accepté. Vous pouvez ajouter cette ligne pour accepter toutes sortes de contenus

urlConnection.setRequestProperty("Accept","*/*");
1
Howy