HOME > android > tips

안드로이드 - Cleartext HTTP ... not permitted 예외 해결 방법

JSFollow06 Oct 2019

Exoplayer에서 http의 mp3파일을 스트리밍하려고 했는데, Cleartext HTTP traffic to www.soundhelix.com not permitted와 같은 에러를 만났습니다.

2019-10-06 18:22:28.363 8724-9511/com.codechacha.exoplayer E/ExoPlayerImplInternal: Source error.
    com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to http://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:282)
        .....
     Caused by: java.io.IOException: Cleartext HTTP traffic to www.soundhelix.com not permitted
        at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:124)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:462)
        ....

문제 원인은 안드로이드에서 기본적으로 Http 접근을 허용하지 않는다는 것입니다. Https로 접근하면 문제가 없지만 해당 사이트가 Https를 지원하지 않는 등의 이유로 Http로 접근을 해야 한다면 예외처리를 해야 합니다.

Android Developer의 Opt out of cleartext traffic를 보시면 안드로이드 Pie(API28)부터 cleartext HTTP를 비활성화한다고 합니다. 따라서 API28 이후에서 Http에 접근하려면 cleartext HTTP를 활성화 시켜야 합니다.

모든 Http URL에 대해서 접근 허용

AndroidManifest의 application 태그에서 android:usesCleartextTraffic를 true로 설정하시면 모든 Http 주소에 접근할 수 있습니다.

<application
        android:label="@string/app_name"
        ...
        android:usesCleartextTraffic="true">

일부 Http URL에 대해서 접근 허용

android:usesCleartextTraffic는 모든 Http 사이트에 대한 접근을 허용합니다. 만약 몇몇 사이트에 대한 접근만 허용하려면 /res/xml/network_security_config.xml 파일을 생성하고 예외 항목들을 추가해야 합니다.

다음과 같이 입력하면 secure.example.com에 대한 접근만 허용이 됩니다.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

리스트를 모두 작성했다면 AndroidManifest에 android:networkSecurityConfig 속성으로 예외 리스트 파일을 설정합니다.

<application
    android:label="@string/app_name"
    ...
    android:networkSecurityConfig="@xml/network_security_config"

참고