web-dev-qa-db-ja.com

アイスクリームサンドイッチのHttpURLConnectionのFileNotFoundException

Android 2.xおよび3.xで正常に動作するAndroidアプリがありますが、Android 4.xで実行すると失敗します。

問題はコードのこのセクションにあります。

_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();
_

アプリケーションがAndroid 4.xで実行されている場合、getInputStream()呼び出しはFileNotFoundExceptionになります。同じバイナリが以前のバージョンのAndroidで実行されている場合、成功します。 URLは、Webブラウザーおよびcurlでも正常に機能します。

ICSでHttpURLConnectionに関する何かが変更されたようです。誰が何が変わったのか、および/または修正が何であるのかを知っていますか?

44

SetDoOutput呼び出しを削除してみてください。このブログから: a blog

編集:POST呼び出しを使用する場合に必要です。

96
reuscam

サーバーが不正なエラーコード(400や401など)を返した場合も、FileNotFoundExceptionがスローされる場合があります。これは次のように処理できます。

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

理由はわかりませんが、リダイレクトを手動で処理すると問題は解決します。

connection.setInstanceFollowRedirects(false);
5
Kirill Kulakov

少し遅れますが、受け入れられたコンテンツを確認することもできます。この行を追加して、あらゆる種類のコンテンツを受け入れることができます

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