[英]Cannot load image which has % in url with picasso
我在我的項目中使用Picasso v2.5.2。 它工作正常,但在某些情況下,網址中有%字符,在這種情況下,畢加索會拋出錯誤。
String url = "http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%25UAB.png";
Picasso picasso = new Picasso.Builder(this).listener(new Picasso.Listener() {
@Override
public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
exception.printStackTrace();
}
}).build();
picasso.setLoggingEnabled(true);
picasso.load(url).placeholder(R.drawable.parking_placeholder).error(R.drawable.icn_rupee).into(mIvTicket);
上面的代碼給出了以下錯誤:
11-07 17:07:17.383 9531-9531/com.gmpuser.app W/System.err: java.io.IOException: Invalid % sequence: %UA in path at index 91: http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%UAB.png
11-07 17:07:17.383 9531-10104/com.gmpuser.app D/Picasso: Dispatcher delivered [R0]+1258ms
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.Request.uri(Request.java:64)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:268)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.UrlConnectionDownloader.load(UrlConnectionDownloader.java:93)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:47)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:206)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at java.lang.Thread.run(Thread.java:818)
11-07 17:07:17.393 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)
對URL進行編碼似乎是一種解決方案,但是,我使用Uri.encode對url進行編碼 ,然后將編碼后的字符串提供給Picasso,但這樣做也不行。
String url = "http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%25UAB.png";
String urlEncoded = Uri.encode(url);
Picasso picasso = new Picasso.Builder(this).listener(new Picasso.Listener() {
@Override
public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
exception.printStackTrace();
}
}).build();
picasso.setLoggingEnabled(true);
picasso.load(urlEncoded).placeholder(R.drawable.parking_placeholder).error(R.drawable.icn_rupee).into(mIvTicket);
上面的代碼給出了以下錯誤
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: java.lang.IllegalStateException: Unrecognized type of request: Request{http%3A%2F%2Fdev.api.getmyparking.com%3A5000%2Fapi%2Fv1%2FContainers%2Fgmp-booking-tickets%2Fdownload%2FAVGA3JJ%25UAB.png}
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter$2.load(BitmapHunter.java:66)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:206)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at java.lang.Thread.run(Thread.java:818)
11-07 17:09:42.313 9531-9531/com.gmpuser.app W/System.err: at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)
嘗試這個,
String urlStr = "http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%25UAB.png";
String url = Uri.parse(urlStr)
.buildUpon()
.build()
.toString();
在這里看到我的答案。
而不是使用%25傳遞url,您可以使用空格並嘗試此方法
String url1 = url.replaceAll(" ", "%25");
Picasso.with(context).load(url1).into(mIvTicket);
可能這對你有用,因為我只是這樣做。
使用URLEncoder編碼%
String url = "http://dev.api.getmyparking.com:5000/api/v1/Containers/gmp-booking-tickets/download/AVGA3JJ%25UAB.png";
String encodedUrl = URLEncoder.encode(url, "utf-8");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.