要点
CookieManager
を使用してSecure
属性の付いたCookieを取得するには、CookieManager#getCookie
に渡す文字列にはhttps://
から始まるURLを渡さなければならない。
(※HttpOnly属性も同様)
WebViewとCookieManager
AndroidでWebView
を使用して閲覧しているページのCookieをプログラム側で取得するには次のようにWebView
とCookieManager
を準備する。
class HogeActivity : AppCompatActivity() {
private val cookieManager = CookieManager.getInstance()
private lateinit var binding : ActivityHogeBinding
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ActivityHogeBinding.inflate(layoutInflater)
setContentView(binding.root)
initializeWebView(binding.webView)
}
override fun finish() {
// WebView次回利用時に現在のページから始まらないようにするために必要
binding.webView.loadUrl("about:blank")
super.finish()
}
// ------ //
private fun initializeWebView(webView: WebView) {
cookieManager.acceptCookie()
cookieManager.setAcceptThirdPartyCookies(webView, true)
// ほか色々設定
webView.loadUrl("https://~~~")
}
}
CookieManager#getCookie(URL or Domain)
を使用してkey0=value0; key1=value1; ...
の書式でCookie文字列が取得できるので、適当に連想配列にしたり必要なものだけ取り出したり。
@OptIn(ExperimentalStdlibApi::class)
val cookies = buildMap<String, String> {
val cookiesStr = cookieManager.getCookie(".hoge.com")
cookiesStr.split(";").forEach {
val separatorIndex = it.indexOf("=")
if (separatorIndex == -1) return@forEach
val key = it.substring(0, separatorIndex)
val value = it.substring(separatorIndex + 1)
put(key, value)
}
}
上記のようにCookieManager#getCookie
に”.hoge.com"のようなドメイン名を渡す場合、得られる文字列にSecure
属性やHttpOnly
属性がついたCookieは含まれないので注意が必要。
Secure
属性がついたCookieを取得する場合は、次のように明示的にhttps://
から始まるURLを渡す必要がある。
@OptIn(ExperimentalStdlibApi::class)
val cookies = buildMap<String, String> {
val cookiesStr = cookieManager.getCookie("https://www.hoge.com")
cookiesStr.split(";").forEach {
val separatorIndex = it.indexOf("=")
if (separatorIndex == -1) return@forEach
val key = it.substring(0, separatorIndex)
val value = it.substring(separatorIndex + 1)
put(key, value)
}
}
せやろなという感じだった。