Come aggiungere il token di authentication in intestazione nella libreria di Picasso

Sto utilizzando la libreria di picasso per scaricare la bitmap così nelle API che ho bisogno di passare il token nelle intestazioni. Ho provato sotto il codice da questo thread libreria di Android Picasso, Come aggiungere le intestazioni di authentication?

 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; } 

Richiesta di 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); 

Domanda

Ho eseguito il debug del mio codice e lo vedo mai chiamato metodo di OkHttpDownloader di OkHttpDownloader di OkHttpDownloader modo che la mia richiesta non sia sempre rioutput e alla fine chiama onBitmapFailed .

  • Eccezione host non risoluta Android
  • Plugin videoPlayer PhoneGap non funziona
  • Come convertire il formato di 24 ore in formato 12 ore?
  • Firebase + autorizzazioni
  • Ritardo di AudioTrack: getBuffer timed out
  • come aggiungere volley image request in un arrayslist?
  • Aiuti prego quali sono le cose che devo fare per passare correttamente il valore delle intestazioni.

    Grazie in anticipo.

  • Android - Il client Paho Mqtt non riceve i messaggi una volta che la connettività di networking si modifica (dati mobili distriggersti ​​e abilitati nuovamente)
  • Imansible annullare l'attività Async in android
  • Problema di rendering per Android con Intellij 13.1.3
  • Problema con ComposeShader su Android 4.1.1
  • Come posso determinare se la mia applicazione android ha una perdita di memory?
  • SecurityException in getPassword di accountManager in android
  • 5 Solutions collect form web for “Come aggiungere il token di authentication in intestazione nella libreria di Picasso”

    Ci sono voluti due giorni per risolvere questo problema. Per il download personalizzato non è necessario call with metodo perché questo inizializzerà l'istanza di scaricamento predefinito e picasso. Semplicemente fare di seguito come questo che ti aiuterà a get 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); 

    Ho avuto lo stesso problema, ma nel mio caso avevo dimenticato di avere un certificato auto-firmato sul mio server in modo OkHttp stava ricevendo il certificato e poi rifiutando di recuperare qualsiasi image. Di conseguenza, dal lato server sembrava che Picasso non facesse alcuna richiesta.

    Quindi la correzione era quella di creare un client OkHttp non sicuro che non provare i certificati:

     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); } } 

    Usalo poi nel mio 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(); 

    implementare Loader alla class BasicAuthOkHttpLoader.

    Nel metodo Load override, scrivere la logica di authentication 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); } 

    Per ulteriori informazioni: http Basic autorizza l'implementazione di un loader personalizzato

    Ho usato un'altra biblioteca AQuery ed è stato in grado di get non solo accesso autorizzato a picassa rolling in pochi minuti ma anche la biblioteca utilizzata le credenziali dei telefoni quindi è stato estremamente facile.

    Anche se non si utilizza questa libreria, dare un'occhiata a come ottengo il metodo sperimentale di includere solo i campi necessari per lavorare sotto. I risultati più piccoli rendono più veloce la networking io e una grande differenza nella CPU. Poiché il JSON è più piccolo analizza più velocemente e il DOM per il xml è più piccolo è costruito estremamente veloce.

    Qui sto utilizzando il metodo sperimentale di restituire solo i campi che voglio per gli album pubblici per l'utente in 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, L'okHttpDownloader è cambiato. Fare riferimento al link sottostante per aggiungere le intestazioni di authentication

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

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.