Cómo agregar un token de autenticación en el encabezado de la biblioteca Picasso

Estoy utilizando la biblioteca picasso para descargar el mapa de bits por lo que en la api necesito pasar el token en los encabezados. He intentado por debajo del código de este hilo Biblioteca Android Picasso, ¿Cómo agregar los encabezados de autenticación?

 public static Picasso getImageLoader(final Context context) { // fetch the auth value sSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); Picasso.Builder builder = new Picasso.Builder(context); builder.downloader(new OkHttpDownloader(context) { @Override protected HttpURLConnection openConnection(Uri uri) throws IOException { HttpURLConnection connection = super.openConnection(uri); connection.setRequestProperty(Constant.HEADER_X_API_KEY, sSharedPreferences.getString(SharedPreferenceKeys.JSESSIONID, "")); return connection; } }); sPicasso = builder.build(); return sPicasso; } 

Solicitud Picasso

 mTarget = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) { mdpImageView.setImageBitmap(bitmap); Logger.d(TAG, "Test"); } @Override public void onBitmapFailed(Drawable drawable) { Logger.d(TAG, "Test"); } @Override public void onPrepareLoad(Drawable drawable) { Logger.d(TAG, "Test"); } }; CustomPicasso.getImageLoader(getActivity()).with(getActivity()).load(URL).into(mTarget); 

Pregunta

He depurado mi código y veo que nunca se llama método de override de OkHttpDownloader de OkHttpDownloader para que mi solicitud siempre falla y al final llama a onBitmapFailed .

Por favor, ayudar a lo que son las cosas que tengo que hacer para pasar el valor de los encabezados correctamente.

Gracias por adelantado.

Tardó dos días en resolver este problema. Para el descargador personalizado no tiene que llamar with método porque esto inicializará la instancia de descargador y picasso predeterminada. Simplemente haga abajo como esto que le ayudará a obtener bitmap.

 Picasso.Builder builder = new Picasso.Builder(getActivity()); picasso = builder.downloader(new OkHttpDownloader(getActivity()) { @Override protected HttpURLConnection openConnection(Uri uri) throws IOException { HttpURLConnection connection = super.openConnection(uri); connection.setRequestProperty(Constant.HEADER_X_API_KEY, mSharedPreferences.getString(SharedPreferenceKeys.JSESSIONID, "")); return connection; } }).build(); picasso.load(url).into(mTarget); 

Tuve el mismo problema, pero en mi caso había olvidado que tenía un certificado auto-firmado en mi servidor para OkHttp estaba recibiendo el certificado y luego se niega a recuperar las imágenes. En consecuencia, desde el lado del servidor parecía que Picasso no estaba haciendo ninguna solicitud.

Así que la solución fue crear un cliente OkHttp inseguro que no prueba los certificados:

 static OkHttpClient getUnsafeOkHttpClient() { try { // Create a trust manager that does not validate certificate chains final TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } } }; // Install the all-trusting trust manager final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // Create an ssl socket factory with our all-trusting manager final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setSslSocketFactory(sslSocketFactory); okHttpClient.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); return okHttpClient; } catch (Exception e) { throw new RuntimeException(e); } } 

A continuación, utilizarlo en mi CustomOkHttpDownloader:

 static class CustomOkHttpDownloader extends OkHttpDownloader { private String accessToken; public CustomOkHttpDownloader(Context context, String accessToken) { super(getUnsafeOkHttpClient()); this.accessToken = accessToken; } @Override protected HttpURLConnection openConnection(final Uri uri) throws IOException { HttpURLConnection connection = super.openConnection(uri); connection.setRequestProperty("Authorization", "Bearer " + accessToken); Log.d(LOG_TAG, "Creating connection for " + uri + " with " + accessToken); return connection; } } 
 Picasso picasso; Builder builder = new Picasso.Builder(this); picasso = builder.loader(new BasicAuthOkHttpLoader(this)).build(); 

Implementar la clase Loader a BasicAuthOkHttpLoader.

En el método de carga de anulación, escriba la lógica de autenticación ur.

  @Override public Response load(String url, boolean localCacheOnly) throws IOException { HttpURLConnection connection = client.open(new URL(url)); String authString = "username:password"; String authStringEnc = Base64.encodeToString(authString.getBytes(), Base64.NO_WRAP); connection.setRequestProperty("Authorization", "Basic " + authStringEnc); connection.setUseCaches(true); // no caching happens without this setting in our scenario connection.setRequestProperty("Cache-Control", "max-stale=2592000");// 30 days if (localCacheOnly) { connection.setRequestProperty("Cache-Control", "only-if-cached"); } boolean fromCache = parseResponseSourceHeader(connection.getHeaderField(RESPONSE_SOURCE)); return new Response(connection.getInputStream(), fromCache); } 

Para más detalles: http Basic auth la implementación de un cargador personalizado

He utilizado otra biblioteca AQuery y fue capaz de obtener no sólo el acceso autorizado a picassa rodando en pocos minutos, sino también la biblioteca utiliza las credenciales de teléfonos por lo que fue muy fácil.

Incluso si no usas esta biblioteca echa un vistazo a cómo obtengo el método experimental de incluir sólo los campos necesarios que trabajan debajo. Los resultados más pequeños hacen que la red sea más rápida y una gran diferencia en la CPU. Debido a que el JSON es más pequeño se analiza más rápido o el DOM para el xml es más pequeño que se construye muy rápido.

Aquí estoy usando el método experimental de devolver sólo los campos que quiero para los álbumes públicos para el usuario en XML.

 GoogleHandle handle = new GoogleHandle(this.getActivity(), AQuery.AUTH_PICASA, AQuery.ACTIVE_ACCOUNT); // experimental fields method encoding the data part of the query string only. String url = ""; try { url = "https://picasaweb.google.com/data/feed/api/user/default?kind=album&access=public&fields=" + URLEncoder .encode("entry(title,id,gphoto:numphotosremaining,gphoto:numphotos,media:group/media:thumbnail)", "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); //whatever I know this will work // I hard coded the string. } aq.auth(handle).progress(R.id.pbTrackerAlbumsProgress) .ajax(url, XmlDom.class, this, "renderAlbums"); public void renderAlbums(String url, XmlDom xml, AjaxStatus status) { List<PicasaAlbum> entries = convertAll(xml); if (entries.size() > 0) { isAuthError = false; // if the xml iis null we can't display the list // we can setup the adapter aa = new ArrayAdapter<PicasaAlbum>(this.getActivity(), R.layout.listview_item_album, entries) { public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { // convertView = // View.inflate(getActivity().getBaseContext(), // R.layout.listview_item_album, parent); convertView = getActivity().getLayoutInflater() .inflate(R.layout.listview_item_album, parent, false); } PicasaAlbum picasaAlbum = getItem(position); AQuery aqLocal = aq.recycle(convertView); aqLocal.id(R.id.albumTitle).text(picasaAlbum.title); // aq.id(R.id.meta).text(picasaAlbum.author); String tbUrl = picasaAlbum.thumbNailUrl.toString(); Bitmap placeholder = aqLocal .getCachedImage(R.drawable.ic_launcher2); if (aqLocal.shouldDelay(position, convertView, parent, tbUrl)) { aqLocal.id(R.id.tb).image(placeholder); } else { aqLocal.id(R.id.tb).image(tbUrl, true, true, 0, R.drawable.ic_launcher2x, placeholder, AQuery.FADE_IN_NETWORK, 0); } return convertView; } }; ((TextView) view.findViewById(R.id.tvTrackerExistingAlbum)) .setText("Select the album for route marker photos"); ((ProgressBar) view.findViewById(R.id.pbTrackerAlbumsProgress)) .setVisibility(View.GONE); ListView lv = (ListView) view.findViewById(R.id.lvTrackerAlbums); lv.setAdapter(aa); aa.notifyDataSetChanged(); lv.setVisibility(View.VISIBLE); } } 

Picasso 2.5, El okHttpDownloader ha cambiado. Consulte el siguiente enlace para agregar los encabezados de autenticación

https://github.com/square/picasso/issues/900

  • Picasso "Cambiar tamaño y centerCrop" o ImageView "centerCrop"?
  • ViewPager + Picasso
  • ¿Está bien crear una nueva instancia de picasso cada vez
  • ¿Es posible descargar imágenes de la memoria caché en picasso?
  • Java.lang.IllegalArgumentException: La ruta no debe estar vacía en Picasso
  • ¿Cómo lograr el seguimiento de la imagen de marcador de posición en ImageView Android como Pinterest?
  • Utilizar Picasso para obtener una devolución de llamada con un mapa de bits
  • Uso de la biblioteca Picasso con ListView
  • ¿Cómo implementar correctamente el feed (similar a Facebook / Instagram) en Android?
  • ¿Cómo integrar Google Drive con Picasso en Android?
  • ViewPager demasiado lento al desplazar (con Picasso)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.