Android 8: クリアテキスト HTTP トラフィックは許可されません 質問する

Android 8: クリアテキスト HTTP トラフィックは許可されません 質問する

Android 8 のユーザーから、私のアプリ (バックエンド フィードを使用) がコンテンツを表示しないという報告がありました。調査の結果、Android 8 で次の例外が発生していることがわかりました。

08-29 12:03:11.246 11285-11285/ E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * 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)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)
at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)
at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

(パッケージ名、URL、その他の識別子は削除しました)

Android 7以下ではすべて動作しますが、android:usesCleartextTrafficマニフェストでは設定していません( に設定してもtrue役に立ちません。いずれにしてもこれがデフォルト値です)。また、ネットワーク セキュリティ情報も使用していません。 を呼び出すと、同じapkファイルを使用して、 Android 8(古いバージョンNetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted())が返されます。Android Oに関するGoogle情報でこれについて言及されているものを探しましたが、見つかりません。falsetrue

ベストアンサー1

によるとネットワークセキュリティ構成-

Android 9 (API レベル 28) 以降では、クリアテキストのサポートはデフォルトで無効になっています。

こちらもご覧くださいAndroid M とクリアテキスト トラフィックとの戦い

コードラボの説明Googleより

オプション1 -

まずURLをhttps://次のように入力してみてください。http://

オプション2 -

ファイルを作成res/xml/network_security_config.xml-

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</domain>
    </domain-config>
</network-security-config>

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        ...>
        ...
    </application>
</manifest>

オプション3 -

android:usesCleartextトラフィックドキュメント

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

また、@david.s の回答指摘されることandroid:targetSandboxVersionも問題になる可能性がある -

によるとマニフェストドキュメント-

android:targetSandboxVersion

このアプリが使用するターゲット サンドボックス。サンドボックスのバージョン番号が高いほど、セキュリティ レベルが高くなります。デフォルト値は 1 ですが、2 に設定することもできます。この属性を 2 に設定すると、アプリは別の SELinux サンドボックスに切り替わります。レベル 2 のサンドボックスには、次の制限が適用されます。

  • usesCleartextTrafficネットワーク セキュリティ構成ののデフォルト値はfalse です。
  • UIDの共有は許可されていません。

オプション4 -

持っている場合はandroid:targetSandboxVersion<manifest>それを減らしてください1

AndroidManifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

おすすめ記事