1. ホーム
  2. android

[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない

2022-02-22 09:40:59

質問

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 は役に立ちません、どうせデフォルト値ですから)、Network Security Informationも使っていません。もし私が NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted() を返します。 false はAndroid 8の場合です。 true は、同じapkファイルを使用して、古いバージョンのために。 Android Oに関するGoogleの情報でこの件に関する記述を探したのですが、うまくいきませんでした。

解決方法を教えてください。

によると ネットワークセキュリティの設定 -

Android 9 (API level 28)からは、ClearTextサポートが無効になっています。 はデフォルトで使用されます。

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

コデラブス説明 Googleより

オプション1

まず、URLに "http://" ではなく "https://" と打ってみてください。

オプション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:usesCleartextTraffic Doc.

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に設定すると、アプリは以下のように切り替わります。 別の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>