web-dev-qa-db-fra.com

Glide FileNotFoundException: Aucun fournisseur de contenu lors du chargement d'images à partir d'Internet

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?

13
David

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>
2
tamtom