web-dev-qa-db-ja.com

Glide FileNotFoundException:インターネットから画像を読み込むときにコンテンツプロバイダーがありません

独自のREST APIを作成しましたが、現在はエンドポイントがあり、画像を表示しています。ここでは、スプリングブートアプリケーションでどのように見えるか

@GetMapping("/image/{name:.+}")
    public byte[] getImage(@PathVariable(value = "name") String name) {
        return storageService.loadFileAsByteArray(name);
    }

これはストレージサービス方式です

 public byte[] loadFileAsByteArray(String filename) {
            Resource resource = loadFile(filename);
            try {
                return IOUtils.toByteArray(resource.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

ここで私がAndroidアプリで行うこと

Glide.with(context!!.applicationContext).load("http://myipaddress/api/image/myimage.jpg").into(it)

ここでグライドから得たもの

根本原因(2/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)

しかし、ブラウザでそのリンクに移動すると、すべてが機能します。なぜこれが起こっているのですか?

15
David

API 28をターゲットにしていて、Android 9とhttpで始まるURLに問題が表示される場合、問題は前述のクリアテキストトラフィックにあります here ネットワークセキュリティ構成

Android 9.0(APIレベル28)以降、デフォルトではクリアテキストのサポートは無効になっています。

へのすべての接続が常にHTTPS経由で行われるようにして、敵対的なネットワークからの機密トラフィックを保護します。

平文トラフィックをオプトアウトする場合

アプリケーションマニフェストのみにこのプロパティを追加します

<application
 . 
 Android:usesCleartextTraffic="true"
 .

 >

 </application>

そして、特定のドメインにルールを持たせたい場合

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