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