我在我的项目中使用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 对网址进行编码,然后将编码后的字符串提供给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)
答案 0 :(得分:2)
试试这个,
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();
请参阅我的回答here。
答案 1 :(得分:1)
而不是使用%25传递网址,您可以使用空格并尝试使用此方法
String url1 = url.replaceAll(" ", "%25");
Picasso.with(context).load(url1).into(mIvTicket);
这可能会对你有用,因为我只是这样做。
答案 2 :(得分:0)
使用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");