Picasso 带 Cookies 加载图片

来自Silica Library | 間奏時光
Silica讨论 | 贡献2019年4月15日 (一) 03:55的版本 (创建页面,内容为“Category:Android 2019-04-15 11:50 == 用途 ==   在加载验证码的时候,如果 Picasso 直接请求图片而不加上 Cookies,可能导致 API 返…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

2019-04-15 11:50

用途

  在加载验证码的时候,如果 Picasso 直接请求图片而不加上 Cookies,可能导致 API 返回验证码错误的问题。

解决方法

  设置一个 CookieImageDownloader。

public class CookieImageDownloader extends UrlConnectionDownloader {

    public CookieImageDownloader(Context context) {
        super(context);
    }

    @Override
    protected HttpURLConnection openConnection(Uri path) throws IOException {
        HttpURLConnection conn = super.openConnection(path);
        conn.setRequestProperty("Cookie", BaseApplication.getCookies());
        return conn;
    }
}

  在 openConnection(Uri path) 中的 BaseApplication.getCookies() 是一个字符串,样式为:

key=value; key=value; key=value

  因为每人所用的网络框架都不同,因此这里只举出我所使用的 OkGo 3 的例子:

StringBuilder cookieBuilder = new StringBuilder();

        for (int i = 0; i < cookieStore.getAllCookie().size(); i++) {
            cookieBuilder.append(cookieStore.getAllCookie().get(i).name());
            cookieBuilder.append("=");
            cookieBuilder.append(cookieStore.getAllCookie().get(i).value());

            if (i < cookieStore.getAllCookie().size() - 1) {
                cookieBuilder.append(";");
            }
        }

        BaseApplication.cookies = cookieBuilder.toString();

  最后在需要加载图片的地方:

Picasso picasso = new Picasso.Builder(activity).downloader(new CookieImageDownloader(activity)).build();
picasso.load(NetRequest.getCodeImg)
        .fit()
        .networkPolicy(NetworkPolicy.NO_STORE, NetworkPolicy.NO_CACHE)
        .memoryPolicy(MemoryPolicy.NO_STORE, MemoryPolicy.NO_CACHE)
        .centerCrop()
        .config(Bitmap.Config.RGB_565)
        .into(activity.binding.ivCode);

  大功告成。