Je veux charger l'image à partir de l'URL avec la bibliothèque Android Picasso et l'afficher pour la voir, mais j'obtiens une erreur uniquement dans Android 7.0 Nougat.
L'URL de l'image utilise HTTPS. Dans mon autre projet avec la même URL d'image, je n'ai pas obtenu l'erreur si je lance dans le vrai périphérique 7.0 nougat, mais cela reste une erreur si je lance l'émulateur 7.0 Nougat.
J'essaye vers une autre image d'URL d'un domaine différent et je n'ai pas non plus reçu l'erreur.
comment puis-je la corriger?
W/System.err: com.squareup.picasso.NetworkRequestHandler$ResponseException: HTTP 504 W/System.err: at com.squareup.picasso.NetworkRequestHandler.load(NetworkRequestHandler.java:51) W/System.err: at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:219) W/System.err: at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:175) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:354)
Picasso.get().load("My_URL_Image") .resize(200,200) .centerInside() .placeholder(R.drawable.ic_default) .error(R.drawable.ic_default) .into(holder.imageView, object : Callback{ override fun onSuccess() {} override fun onError(e: Exception?) { e?.printStackTrace() } })
4 Réponses :
=> Essayez de vérifier votre connexion Internet via l'émulateur
Ma connexion Internet fonctionne correctement, car mon application utilise une connexion Internet pour demander au serveur
Mais le code que vous obtenez indique le délai de connexion, ce qui signifie que votre Internet ou votre serveur est en panne ou ne répond pas dans le temps imparti.
Vous devrez définir un networkSecurityConfig
dans votre fichier AndroidManifest.xml
comme ceci:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>
Ensuite dans votre xml
, vous allez créer un nouveau fichier selon le nom de la mention de code ci-dessus network_security_config
pour activer toutes les demandes sans chiffrement:
<?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:networkSecurityConfig="@xml/network_security_config"> </application> </manifest>
Maintenant, votre l'application fera toutes les demandes pour tout type de connexion. Pour plus d'informations, lisez ceci .
Je l'espère ' Je vais vous aider ....!
pour moi ça n'aide pas
C'est la solution qui a fonctionné pour moi. Merci! (Je ne l'utiliserais que pour mon projet expérimental)
Merci de m'aider les gars, j'ai trouvé ma solution pour ce cas, je supprime FirebaseFirestore.getInstance ()
sur mon activité à domicile car je n'utilise plus Firebase sur la page d'accueil. Je ne sais pas pourquoi mais si je ne supprime pas ce code dans ma page d'accueil, l'application fonctionnant normalement dans un appareil réel Android 7.0 Nougat mais toujours une erreur dans l'émulateur 7.0 Nougat.
Je ne pense pas que ce soit la bonne réponse. Je suis confronté à ce problème et je n'utilise même pas Firebase sur mon projet.
ce n'est pas la bonne solution à ce problème
En maintenant une ancienne application avec une version minSdkVersion faible, je ne savais pas non plus à quel point le texte clair pouvait avoir un impact sur le reste de l'API de mon application, j'ai donc préféré une approche avec un OkHttpClient personnalisé juste pour Picasso.
Versions :
public 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 new java.security.cert.X509Certificate[]{}; } } }; // 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.Builder builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]); builder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }); OkHttpClient okHttpClient = builder.build(); return okHttpClient; } catch (Exception e) { throw new RuntimeException(e); } } public void loadLogo(String url) { if (url != null && !url.isEmpty()) { OkHttpClient picassoClient = getUnsafeOkHttpClient(); Picasso picasso = new Picasso.Builder(this).downloader(new OkHttp3Downloader(picassoClient)).build(); picasso.setLoggingEnabled(true); picasso.load(url) .placeholder(R.drawable.default_logo) .error(R.drawable.default_logo) .into(titleIV); } }
Bonne solution!! Cela m'a aidé à envoyer une requête avec les en-têtes ("Accepter", "image / jpg") et ("Content-Type", "image / jpg"). Comment définir le client avec des en-têtes: stackoverflow.com/questions/35728484/...
504 est une erreur de temporisation. Avez-vous vérifié si cette erreur provient d'un autre émulateur ou non?
Vérifiez ce fil: github.com/square/picasso/issues/1896
Je cours dans le vrai périphérique 7.0 Nougat (Xiaomi) mais j'obtiens toujours cette erreur
Je l'ai lu et essayé mais cela n'a pas fonctionné. Cela a-t-il quelque chose à voir avec le domaine de l'URL de l'image?