Picasso 帶 Cookies 加載圖片
於 2019年4月15日 (一) 03:55 由 Silica(對話 | 貢獻) 所做的修訂 (创建页面,内容为“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);
大功告成。