1
votes

Retrofit2 call.enqueue (le nouveau Callback () ne fonctionne pas dans Android 9 et plante l'application sans aucune erreur dans le logcat

J'analyse certaines données du serveur par Retrofit2. Dans d'autres versions d'Android et de l'émulateur, cela fonctionne bien. Mais le problème est que cela ne fonctionne pas sous Android 9 (Pie) et Android Oreo (8.1). Pour cette raison, l'application va planter à chaque fois que je l'ai installée. Un autre problème est qu'il ne montre aucune erreur dans le Logcat. Alors, quelle peut être la solution?

En lisant certains blogs et Stack Overflow, j'ai essayé d'ajouter android: usesCleartextTraffic = "true" dans le AndroidManifest . J'ai également ajouté le fichier ci-dessous dans le AndroidManifest .

ApiInterface api = retrofit.create(ApiInterface.class);
Call<ServerResponse> call = api.getServerResult(new String(encodeValue));

call.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(@NonNull Call<ServerResponse> call, @NonNull Response<ServerResponse> response) {
            Log.i(TAG, "onResponse: " + response.message());
            progressBar.setVisibility(View.GONE);
            ServerResponse server = response.body();
            Log.i(TAG, "response callback");
            if (server != null) {
                for (Result result : server.getResults()) {
                    Log.i("server", result.getHostName());
                    Log.i("server", result.getIP());
                    Log.i("server", result.getScore());
                    Log.i("server", result.getLatency());
                    Log.i("server", result.getCountryLong());
                    Log.i("server", result.getCountryShort());

                    data.add(result.getCountryLong());
                    progressBar.setVisibility(View.GONE);
                    flagLink.add("http://v4v.info/countryflag/" + result.getCountryShort().toLowerCase() + ".png");
                }

                //Log.i(TAG, "onResponse: " + flagLink);

                recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
                MyAdapter adapter = new MyAdapter(getActivity(), data, flagLink);
                recyclerView.setAdapter(adapter);
            }
        }

        @Override
        public void onFailure(@NonNull Call<ServerResponse> call, @NonNull Throwable t) {
            Log.i(TAG, "onFailure: " + t.getMessage());
        }
    });

où se trouve le fichier network_security_config

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">116.203.27.235/</domain>
    </domain-config>
</network-security-config>

Voici le code de requête que j'ai créé:

android:networkSecurityConfig="@xml/network_security_config"

Cela fonctionne pour une autre version d'Android comme l'API Android 24 et d'autres, mais pas dans Android 9 (Pie) et Android Oreo (8.1). Je veux l'exécuter dans Android 9 (Pie) et Oreo (8.1).


7 commentaires

Quelle erreur vous obtenez pour appeler call.enqueue (new Callback () ?


Plus précisément, il n'y a pas d'erreur dans le logcat. Mais afficher cette ligne à chaque fois E / libc: Accès refusé en trouvant la propriété "sys.thermal.para"


Avez-vous correctement ajouté les bibliothèques Retrofit2 ?


Ce code fonctionne dans un autre appareil et émulateur Android. J'espère que la configuration est correcte.


si l'erreur ne s'affiche pas dans le logcat, essayez de redémarrer android studio et effacez le cache en effaçant le projet et en le reconstruisant.


Je l'ai fait plusieurs fois. Mais ne fonctionne pas.


Une solution @ShahadatHossain?


3 Réponses :


0
votes

Ajoutez cette ligne dans votre fichier manifeste.

Cela m'a aidé pour l'API Android 24+. essayez ceci.


0 commentaires

0
votes

Si vous N'utilisez PAS https , vous pouvez essayer ma solution dans Manifest , ajoutez cette ligne à la balise application

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true"/>
    <debug-overrides>
        <trust-anchors>
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

puis le fichier network_security_config.xlm pourrait être p>

<application...>
      android:networkSecurityConfig="@xml/network_security_config"
</application>


2 commentaires

Quel devrait être le remplacement des Autorités de certification ajoutées par l’utilisateur de confiance alors qu’elles sont uniquement déboguables? Ne fonctionne pas pour moi.


n'y faites pas attention.



0
votes

Il est peut-être tard, mais cela a fonctionné pour moi.

Ajoutez ceci à votre manifeste:

android: usesCleartextTraffic = "true"

Je pense que c'est parce qu'Android 9 + désactive le trafic en texte clair par défaut, donc vous en avez besoin si vous utilisez la modernisation


1 commentaires

J'ai utilisé ceci à ce moment-là. Mais cela n'a pas fonctionné pour moi.