課題
PicassoでWebP画像を表示したいが、WebPを表示するにはAcceptヘッダーにimage/webp
が必要となる。どうすればよいか。
対応
OkHttpClientを作成し、Picasso.Builderを使ってdownloaderにセットする
addHeaderの内容はChromeのデフォルト値に合わせてみた。
q値(q=0.9)
を付けることで image/webp
が優先されるようにしている
ただし実際に効いているかは未検証。
fun initPicasso(context: Context) { val client = OkHttpClient.Builder() //NetworkInterceptorを使うとファイルキャッシュが効かなくなる .addInterceptor { val rb = it.request().newBuilder() rb.addHeader("Accept", "image/webp,image/*,*/*;q=0.8") it.proceed(rb.build()) } client.cache(createImageCache(context)) if (BuildConfig.DEBUG) { client.addNetworkInterceptor(ApiUtils.stethoInterceptor) } val builder = Picasso.Builder(context) .downloader(OkHttp3Downloader(client.build())) if (BuildConfig.DEBUG) { builder.loggingEnabled(true) .indicatorsEnabled(true) } Picasso.setSingletonInstance(builder.build()) } /** * 画像キャッシュディレクトリ作成 */ private fun createImageCache(context: Context): Cache { val maxSize: Long = 1024 * 1024 * 200 //200MB val dir = context.applicationContext.cacheDir val cache = File(dir, "picasso-cache") if (!cache.exists()) { cache.mkdirs() } return Cache(cache, maxSize) }