2017-03-01 14 views
3

私はString imageUrl = "foo.png"OkHttpClientインターセプタ経由でPicasaにbaseUrl(ホスト)を追加するには?

でオブジェクトPhotoを持っていると私はイメージをロードしようとしているString host = "http://example.com/photos/"

あります

mPicasso.load(photo.getImageUrl()).into(mImageView);

public Picasso providesPicasso(OkHttp3Downloader okHttpDownloader) { 
     return new Picasso.Builder(context).listener(new Picasso.Listener() { 
      @Override 
      public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { 
       exception.printStackTrace(); 
      } 
     }).downloader(okHttpDownloader) 
      .executor(Executors.newSingleThreadExecutor())//avoid OutOfMemoryError 
      .build(); 
    } 

    public OkHttp3Downloader providesPicassoOkHttpClient(Context context) { 
      File cacheDir = createDefaultCacheDir(context, BIG_CACHE_PATH); 
      long cacheSize = calculateDiskCacheSize(cacheDir); 
      OkHttpClient okHttpClient = new OkHttpClient.Builder() 
        .cache(new Cache(cacheDir, cacheSize)) 
        .addInterceptor(new Interceptor() { 
         @Override 
         public Response intercept(Chain chain) throws IOException { 
          Request request = chain.request(); 
          String host = "http://example.com/photos/"; 
          HttpUrl newUrl = request.url().newBuilder().host(host + request.url()).build(); 

          request = request.newBuilder().url(newUrl).build(); 
          return chain.proceed(request); 
         } 
        }) 
        .build(); 
      return new OkHttp3Downloader(okHttpClient); 
     } 
` 

エラー:

java.lang.IllegalStateException: Unrecognized type of request: Request{foo.png} 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at com.squareup.picasso.BitmapHunter$2.load(BitmapHunter.java:66) 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:206) 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159) 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
03-01 14:06:49.856 19150-19150/com.basicflags W/System.err:  at java.lang.Thread.run(Thread.java:818) 
+0

Picassoは、イメージURLに基​​づいて適切な 'RequestHandler'実装を見つけようとしているため、リクエストを拒否します。 'NetworkRequestHandler'は'(SCHEME_HTTP.equals(scheme)|| SCHEME_HTTPS.equals(scheme)) 'のみ要求を受け付け、要求を拒否します。だから、あなたが 'Interceptor'に到達したいのであれば、完全なURLを前もって構築しなければならないだろう - ヘッダーを追加することは問題ではないはずです。 –

+0

https://gist.github.com/swankjesse/8571a8207a5815cca1fb – pouya

答えて

2

ここでの問題はPicassoがあるということですタイプがRequestであると認識しないため、リクエストを拒否しています。だから、傍受する要求はありません。

W/System.err: java.lang.IllegalStateException: Unrecognized type of request: Request{img_fjords.jpg} 

あなたのInterceptor内のあなたのURLを変換してはならないと事前ことを行う必要があります。 Picasso.BuilderPicasso.RequestTransformerを追加できます。ドキュメントごとのようにRequestTransformer次のとおりです。

A transformer that is called immediately before every request is submitted. This can be used to modify any information about a request. For example, if you use a CDN you can change the hostname for the image based on the current location of the user in order to get faster download speeds.

public Picasso providesPicasso(OkHttp3Downloader okHttpDownloader) { 
    return new Picasso.Builder(context).listener(new Picasso.Listener() { 
     @Override 
     public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { 
      exception.printStackTrace(); 
     } 
    }) 
      .downloader(okHttpDownloader) 
      .requestTransformer(new Picasso.RequestTransformer() { 
       @Override 
       public com.squareup.picasso.Request transformRequest(com.squareup.picasso.Request request) { 
        Log.d(TAG, "nonTransformedRequest: " + request.uri.toString()); 

        String host = "https://www.w3schools.com/w3css/"; 
        com.squareup.picasso.Request build = new com.squareup.picasso.Request.Builder(Uri.parse(host + request.uri.toString())).build(); 

        Log.d(TAG, "transformedRequest: " + build.uri.toString()); 
        return build; 
       } 
      }) 
      .executor(Executors.newSingleThreadExecutor())//avoid OutOfMemoryError 
      .build(); 
} 

そして、あなたはあなたのInterceptor

public OkHttp3Downloader providesPicassoOkHttpClient(Context context) { 
     File cacheDir = createDefaultCacheDir(context, BIG_CACHE_PATH); 
     long cacheSize = calculateDiskCacheSize(cacheDir); 
     OkHttpClient okHttpClient = new OkHttpClient.Builder() 
       .cache(new Cache(cacheDir, cacheSize)) 
       .addInterceptor(new Interceptor() { 
        @Override 
        public Response intercept(Chain chain) throws IOException { 
         Request request = chain.request(); 
         Log.d(TAG, "URL in Interceptor: "+request.url()); 
         request = request.newBuilder().build(); //ADD HEADERS HERE 
         return chain.proceed(request); 
        } 
       }) 
       .build(); 
     return new OkHttp3Downloader(okHttpClient); 
    } 

で残りを扱うことができることを目的として、今、ちょうどここで

mPicasso.load(photo.getImageUrl()).into(mImageView); 

がどのようにあなたのmPicassoを使用私たちのLOG

02-15 15:10:14.767 6531-6531/com.smk.stack D/TAG: nonTransformedRequest: img_fjords.jpg 
02-15 15:10:14.767 6531-6531/com.smk.stack D/TAG: transformedRequest: https://www.w3schools.com/w3css/img_fjords.jpg 
02-15 15:10:14.828 6531-6590/com.smk.stack D/TAG: URL in Interceptor: https://www.w3schools.com/w3css/img_fjords.jpg 
+1

'request = request.buildUpon()を使用する必要があります。 Uri.parse(host + request.uri.toString()))。ビルド(); '変換が失われないようにする – NickUnuchek

3

多分あなたは各写真の写真のURLでconcatベースのURLを試すことができます。

public static final String BASE_IMAGE_URL = "//your image host" 

... 

Picasso.with(getContext()).load(BASE_IMAGE_URL + "image url").into(your imageview); 
+0

はい、それと似ているかもしれませんが、リクエストするヘッダーも追加する必要があります – NickUnuchek

2

まず、インターセプタを介してリクエストにヘッダーを追加できます。あなたはこのようなOkHttpClientを作成することができるよりも

private Interceptor getDefaultHeaderInterceptor() throws IOException { 
     return new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       Request.Builder requestBuilder = chain.request().newBuilder(); 
       requestBuilder.header(ApiConstants.ACCEPT_LANGUAGE, Locale.getDefault().getLanguage()); 
       requestBuilder.header(ApiConstants.AUTHORIZATION, oauthTokenStore.getAccessToken()); 
       return chain.proceed(requestBuilder.build()); 
      } 
     }; 
    } 

public OkHttpClient getOkHttpClient() throws IOException { 
     OkhttpClient.Builder builder = new Builder() 
         .readTimeout(BuildConfig.CONNECTION_READ_TIMEOUT, TimeUnit.SECONDS) 
         .connectTimeout(BuildConfig.CONNECT_TIMEOUT, TimeUnit.SECONDS) 
         .addInterceptor(getDefaultHeaderInterceptor()) 
         .build(); 

... 、最終的にはピカソのインスタンスを作成:

public Picasso providePicasso() { 
     return new Picasso.Builder(context) 
       .downloader(new OkHttp3Downloader(getOkHttpClient())) 
       .build(); 
    } 

@faranjitはあなたに言ったように、あなたがそれを使用することができます。

providePicasso().load(BASE_IMAGE_URL + "image url").into(your imageview); 
1

簡単にしてください!クラスPhotoがありますか?それに方法

public String getFullUrl(Context context) { 
    return context.getString(R.string.host) + imageUrl; 
} 

を追加するには、ホスト定義は、文字列リソースへ移動する(ボーナス:あなたは、ステージング、生産などのために、今、例えば、異なる構成のためにそれを上書きすることができます)。

追加のヘッダーが必要な場合は、Interceptorに追加してください。Picasaの場合、新しい方法を使用してください:

mPicasso.load(photo.getFullUrl(getContext())).into(mImageView); 
関連する問題