J'ai fait mon propre api de repos et maintenant, il ne reste plus qu'un point final où je montre des images. Voici à quoi ça ressemble dans l'application de démarrage de printemps
@GetMapping("/image/{name:.+}")
public byte[] getImage(@PathVariable(value = "name") String name) {
return storageService.loadFileAsByteArray(name);
}
et c'est la méthode du service de stockage
public byte[] loadFileAsByteArray(String filename) {
Resource resource = loadFile(filename);
try {
return IOUtils.toByteArray(resource.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
et voici ce que je fais dans mon application Android
Glide.with(context!!.applicationContext).load("http://myipaddress/api/image/myimage.jpg").into(it)
Alors voici ce que je tire de la glisse
Cause fondamentale (2 sur 2)
Java.io.FileNotFoundException: No content provider: http://myipaddress/api/image/myimage.jpg
at Android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.Java:1112)
at Android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.Java:964)
at Android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.Java:887)
at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.Java:22)
at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.Java:13)
at com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.Java:44)
at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.Java:62)
at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.Java:299)
at com.bumptech.glide.load.engine.DecodeJob.onDataFetcherFailed(DecodeJob.Java:394)
at com.bumptech.glide.load.engine.SourceGenerator.onLoadFailed(SourceGenerator.Java:119)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.Java:151)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.Java:142)
at com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.Java:65)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.Java:97)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.Java:148)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.Java:142)
at com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.Java:65)
at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.Java:97)
at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.Java:62)
at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.Java:299)
at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.Java:269)
at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.Java:230)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1113)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:588)
at Java.lang.Thread.run(Thread.Java:818)
at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.Java:446)
mais si je vais à ce lien dans mon navigateur, tout fonctionne. Pourquoi cela se passe?
Si vous ciblez l'API 28 et que le problème apparaît sous Android 9 et que l'URL commence par http
, votre problème concerne le trafic en texte clair Comme mentionné ici dans la configuration de la sécurité réseau.
À partir d'Android 9.0 (API niveau 28), la prise en charge de cleartext est désactivée par défaut.
assurez-vous que toutes les connexions sont toujours effectuées sur HTTPS pour protéger trafic sensible en provenance de réseaux hostiles.
Si vous souhaitez désactiver le trafic en texte clair
Ajouter cette propriété sur votre application ne manifeste que
<application
.
Android:usesCleartextTraffic="true"
.
>
</application>
Et si vous voulez avoir des domaines spécifiques pour avoir la règle
Créer un fichier res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">secure.example.com</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml -
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission Android:name="Android.permission.INTERNET" />
<application
...
Android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>