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)
....
問題の原因は、Android上で、基本的にHttpアクセスを許可しないことです。 Httpsでアクセスすると、問題がないが、そのサイトがHttpsをサポートしていないなどの理由でHttpでのアクセスを必要がある場合、例外処理をする必要があります。
Android DeveloperのOpt out of cleartext trafficを見れば、Android 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 - FusedLocationProviderClientに位置情報を取得する
- Android - GPS、Network位置情報を取得する(LocationManager)
- Android - adbコマンドでActivity実行
- アンドロイド - MediaStoreにメディアファイルを保存する方法
- Android - Runtime permissionリクエスト方法と例(kotlin)
- Android11 - Storage(ストレージ)の変更まとめ
- Jetpack Compose - RowとColumn
- Android 13 - 細かいメディアファイルの権限
- Android 13でNotification権限をリクエスト、通知を表示する
- エラー解決:android gradle plugin requires java 11 to run. you are currently using java 1.8.
- Query method parameters should either be a type that can be converted into a database column or a List
- Android - TabLayoutの実装方法(+ ViewPager2)
- Android - adbコマンドで特定のパッケージのプロセスの終了
- Android - adb push、pullでファイルのコピー、ダウンロード
- Android - adbコマンドでsettings value確認、変更、
- Android 12 - IntentFilterのexported明示的な宣言
- Android - adb logcatコマンドでログ出力
- Android - ACTION_BOOT_COMPLETEDイベント受信
- Android - Foreground Service実行
- Android - ファイル入出力の例(Read、Write、内部、外部ストレージ)
- Android - アプリの権限を確認(Permission check)
- Android - adbで実行中のプロセス、スレッドリスト及びメモリ情報の確認
- Android - Broadcast Receiver登録およびイベントの受信方法
- Android - Cleartext HTTP ... not permitted例外解決方法
- Androidのビルドエラー - Calls to Java default methods are prohibited in JVM target 1.6
- アンドロイド - Assetsでファイルを読み取る方法
- アンドロイドのさまざまなNotification種類と実装方法
- アンドロイド - INSTALL_FAILED_TEST_ONLYエラー解決方法
- Android EspressoのCustom Matcher実装方法
- Android Espressoを使用してUIをテストする方法(3)
- アンドロイド - CTS hostsideをgradleで構築する方法
- Androidのアプリのデータフォルダーのパスと内部/外部ストレージ説明
- アンドロイド - 最初のApp作成
- Androidをインストールする方法(Windows)