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"
참고
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력