无法加载带有picasso的url中%的图像

时间:2016-11-07 12:04:27

标签: java android 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 对网址进行编码,然后将编码后的字符串提供给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)

3 个答案:

答案 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");