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
に関する何かが変更されたようです。誰が何が変わったのか、および/または修正が何であるのかを知っていますか?
SetDoOutput呼び出しを削除してみてください。このブログから: a blog
編集:POST呼び出しを使用する場合に必要です。
サーバーが不正なエラーコード(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...
}
理由はわかりませんが、リダイレクトを手動で処理すると問題は解決します。
connection.setInstanceFollowRedirects(false);
少し遅れますが、受け入れられたコンテンツを確認することもできます。この行を追加して、あらゆる種類のコンテンツを受け入れることができます
urlConnection.setRequestProperty("Accept","*/*");