Xamarin: AndroidでHTTPリクエストを行うと"Java.IO.IOException: Cleartext HTTP traffic to XXX not permitted"エラー

概要

Android 9以上を対象したアプリでHTTP通信を行うと発生するエラーの対応方法。

詳細

Androidの"対象Androidバージョン"を9.0(API level 28)以上にした場合、HTTPリクエストを行うと以下のエラーが発生する。

Java.IO.IOException: Cleartext HTTP traffic to www.google.com not permitted
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeAbstractVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00014] in <26521a5118b44c858c385715922b9d5d>:0 
  at Java.Net.HttpURLConnectionInvoker.Connect () [0x0000a] in <4ccdb3137d974856b786e1aeebbfbab6>:0 
  at Xamarin.Android.Net.AndroidClientHandler+<>c__DisplayClass44_0.<ConnectAsync>b__0 () [0x0005a] in <4ccdb3137d974856b786e1aeebbfbab6>:0 
  at System.Threading.Tasks.Task.InnerInvoke () [0x0000f] in <5e602907309a47679d31716bdfe8432e>:0 
  at System.Threading.Tasks.Task.Execute () [0x00000] in <5e602907309a47679d31716bdfe8432e>:0 
--- End of stack trace from previous location where exception was thrown ---

  at Xamarin.Android.Net.AndroidClientHandler.DoProcessRequest (System.Net.Http.HttpRequestMessage request, Java.Net.URL javaUrl, Java.Net.HttpURLConnection httpConnection, System.Threading.CancellationToken cancellationToken, Xamarin.Android.Net.AndroidClientHandler+RequestRedirectionState redirectState) [0x0012e] in <4ccdb3137d974856b786e1aeebbfbab6>:0 
  at Xamarin.Android.Net.AndroidClientHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x002cf] in <4ccdb3137d974856b786e1aeebbfbab6>:0 
  at System.Net.Http.HttpClient.FinishSendAsyncBuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x0017e] in <e03aa70ca0174600ac09fcf1848e1777>:0 
  at XamarinHttp.MainPage.HttpRequestGetAsync () [0x0015b] in <ebdc11f380724edfb0a86f95975700ab>:0 
  at XamarinHttp.MainPage.OnButtonClicked (System.Object sender, System.EventArgs eventArgs) [0x0006c] in <ebdc11f380724edfb0a86f95975700ab>:0 
  --- End of managed Java.IO.IOException stack trace ---
java.io.IOException: Cleartext HTTP traffic to www.google.com not permitted
    at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)

対応

<プロジェクト名>.Android以下にあるAssemblyInfo.csに以下を追加する。これによってAndroidManifest.xml<application>android:usesCleartextTraffic="true"が追加される。

[assembly: Application(UsesCleartextTraffic = true)]

android:usesCleartextTrafficの設定については以下を参照。 developer.android.com