Picassoが画像をダウンロードする際のHTTPヘッダにUser-Agent
を追加したくなりました。
picasso2-okhttp3-downloaderの導入
Jakeさんが作ったpicasso2-okhttp3-downloaderを使います。
あと、ログを見たいのでlogging-interceptorというのも追加しておきます。
app/build.gradle
dependencies {
// (省略)
implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
implementation 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
}
実装
このレイアウトのimageView
にインターネットから画像をダウンロードして表示しようと思います。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</android.support.constraint.ConstraintLayout>
普通に通信
公式のサンプル通りに実装すれば、普通に画像ダウンロードされて表示されます。
MainActivity.kt
package com.example.picassosample
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Picasso.get()
.load("http://i.imgur.com/DvpvklR.png")
.into(this.imageView)
}
}
ひとまず基本的なところまではOKなようです。
ヘッダを追加して通信
こんな感じで、PicassoのインスタンスをBuiler
経由で生成して、downloadメソッドの引数にOkHttp3Downloader
クラスのインスタンスを渡すようにします。
この時、通信に使うOkHttpClient
クラスにInterceptor
を追加して、HTTP通信にヘッダをねじ込むようにしておきます。
MainActivity.kt
package com.example.picassosample
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.squareup.picasso.OkHttp3Downloader
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.*
import okhttp3.Credentials
import okhttp3.OkHttpClient
class MainActivity : AppCompatActivity() {
private val picasso: Picasso by lazy {
val client = OkHttpClient.Builder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("User-Agent", "@sudachi808")
.build()
chain.proceed(request)
}
// ↓↓ログ出力用
.addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.HEADERS
})
// ↑↑ログ出力用
.build()
val downloader = OkHttp3Downloader(client)
Picasso.Builder(this)
.downloader(downloader)
.build()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
this.picasso
.load("http://i.imgur.com/DvpvklR.png")
.into(this.imageView)
}
}
こうすることで、User-AgentがHTTPヘッダに追加されます。
ログを見てみるとヘッダが追加されていることも分かります。
logcat
08-31 16:24:12.585 14089 14134 D OkHttp : --> GET https://i.imgur.com/DvpvklR.png
08-31 16:24:12.586 14089 14134 D OkHttp : User-Agent: @sudachi808
08-31 16:24:12.586 14089 14134 D OkHttp : --> END GET
次回へ続きます。