1
votes

Erreur HTTP 504 lors du chargement de l'URL du formulaire d'image avec la bibliothèque Android Picasso

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 commentaires

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?


4 Réponses :


0
votes

=> Essayez de vérifier votre connexion Internet via l'émulateur


2 commentaires

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.



6
votes

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 ....!


2 commentaires

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)



-2
votes

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.


2 commentaires

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



1
votes

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 :

  • OkHttp: 3.10.0
  • Picasso: 2.71828
    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);
        }
    }


1 commentaires

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/...