web-dev-qa-db-fra.com

Problème de chargement d'image Picasso avec Android 9.0 Pie

Je ne suis pas en mesure de charger des images à l'aide de la bibliothèque Picasso dans Android 9.0 Pie. En fait, cela fonctionne bien pour les versions ci-dessous. Il n'affiche aucun message d'erreur. Quelqu'un a partagé ses journaux sur Github en utilisant

Picasso.get().setLoggingEnabled(true);

Il a le journal des messages:

2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: initViewContentFetcherClass
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: ViewContentFetcher : ViewContentFetcher
2018-10-19 13:13:20.467 24840-24862/com.xyz.test.testpicasso D/ViewContentFactory: createInterceptor took 0ms
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Catcher list invalid for [email protected]@147874166
2018-10-19 13:13:20.468 24840-24862/com.xyz.test.testpicasso I/ContentCatcher: Interceptor : Get featureInfo from config pick_mode
2018-10-19 13:13:20.485 24840-24840/com.xyz.test.testpicasso D/Picasso: Main        created      [R1] Request{https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png}
2018-10-19 13:13:20.492 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  enqueued     [R1]+6ms 
2018-10-19 13:13:20.492 24840-24866/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+7ms 
2018-10-19 13:13:20.555 1531-1684/? I/ActivityManager: Displayed com.xyz.test.testpicasso/.MainActivity: +114ms
2018-10-19 13:13:20.555 5475-5603/? D/PowerKeeper.Event: notifyActivityLaunchTime: com.xyz.test.testpicasso/.MainActivity totalTime: 114
2018-10-19 13:13:20.709 735-816/? W/SurfaceFlinger: Attempting to set client state on removed layer: Splash Screen com.xyz.test.testpicasso#0
2018-10-19 13:13:20.710 735-816/? W/SurfaceFlinger: Attempting to destroy on removed layer: Splash Screen com.xyz.test.testpicasso#0
2018-10-19 13:13:20.775 1531-1684/? I/Timeline: Timeline: Activity_windows_visible id: ActivityRecord{821c51 u0 com.xyz.test.testpicasso/.MainActivity t4372} time:9356677
2018-10-19 13:13:21.003 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  retrying     [R1]+518ms 
2018-10-19 13:13:21.004 24840-24872/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+519ms 
2018-10-19 13:13:21.513 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  retrying     [R1]+1027ms 
2018-10-19 13:13:21.514 24840-24877/com.xyz.test.testpicasso D/Picasso: Hunter      executing    [R1]+1028ms 
2018-10-19 13:13:21.516 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  batched      [R1]+1030ms for error
2018-10-19 13:13:21.717 24840-24864/com.xyz.test.testpicasso D/Picasso: Dispatcher  delivered    [R1]+1232ms
12
tejraj

Essayez d'utiliser Android:usesCleartextTraffic="true" dans la balise d'application de votre fichier manifeste! Comme j'ai rencontré le même problème en utilisant Android Volley!

Selon Android Documentation

Indique si l'application a l'intention d'utiliser le trafic réseau en texte clair, tel que HTTP en texte clair. La valeur par défaut est "true". Lorsque l'attribut est défini sur "false", les composants de la plate-forme (par exemple, les piles HTTP et FTP, DownloadManager, MediaPlayer) refusent les demandes de l'application d'utiliser le trafic en texte clair. Les bibliothèques tierces sont vivement encouragées à respecter également ce paramètre. La principale raison pour éviter le trafic en texte clair est le manque de confidentialité, d'authenticité et de protection contre la falsification: un attaquant du réseau peut écouter les données transmises et également les modifier sans être détecté. lien

37
Intsab Haider

Je connais la réponse avec Android:usesCleartextTraffic="true" fonctionne mais cela permettra à toutes les connexions d'être http pas s sur tout, ce qui, je suppose, n'est pas ce que vous voulez en 2018.

Si vous connaissez le domaine que vous atteignez dans http et que vous lui faites confiance , alors il vaut mieux utiliser le configuration de la sécurité du résea .

Définissez un fichier xml dans res/xml/network_security_config.xml

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

Voir le cleartextTrafficPermitted="true" seulement pour secure.example.com et ses sous-marins.

Et puis dans votre AndroidManifest.xml, ajouter Android:networkSecurityConfig="@xml/network_security_config"

Vous pouvez ajouter plusieurs domaines, avec plusieurs configurations, assurez-vous que certains d'entre eux sont https ou l'inverse. Semble IMHO plus sécurisé.

15
Quentin Klein