Picasso 帶 Cookies 加載圖片

出自Silica Library | 間奏時光
於 2019年9月26日 (四) 06:36 由 Silica留言 | 貢獻 所做的修訂
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

2019-04-15 11:50

用途

  在加載驗證碼的時候,如果 Picasso 直接請求圖片而不加上 Cookies,可能導致 API 返回驗證碼錯誤的問題。

版本

compile 'com.squareup.picasso:picasso:2.5.2'

解決方法

  設置一個 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);

  大功告成。