前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Android:okhttp3で画像データ取得時にエラーが発生する

内容

Coilのバージョンを 1.4.0 から 2.1.0 に上げたところ、一部のバナー画像が表示されなくなった。

調査

エラーは以下のようなもので、レスポンスヘッダーのcontent-disposition に無効なキャラクタが含まれているようだ。filenameの「バナー」の部分だろう。

java.lang.IllegalArgumentException: Unexpected char 0x30cf at 22 in content-disposition value:  inline; filename="バナー.jpeg"
                                                                                                        at okhttp3.Headers$Companion.checkValue(Headers.kt:450)

Headers.ktの該当コードを見ると、特定の範囲の文字コード以外を弾いていることが分かる(ラムダ部分はrequire()=falseの場合に実行される)。

// okhttp.Headers.checkValue()の内容
private fun checkValue(value: String, name: String) {
  for (i in value.indices) {
    val c = value[i]
    require(c == '\t' || c in '\u0020'..'\u007e') {
      format("Unexpected char %#04x at %d in %s value", c.toInt(), i, name) +
          (if (isSensitiveHeader(name)) "" else ": $value")
    }
  }
}

ということでレスポンスヘッダーのcontent-dispositionに規定の文字列以外があるとエラーになるものと思われる。

結論

Coilのどこが変わったかは不明。strict云々が書かれた部分があったのでその辺かも。 アプリ側でできることはなさそう。 画像のファイル名に日本語を使うのを止めてもらうか、Coilのバージョンを1.4.2に戻す。

参考

github.com

square.github.io