独自の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)
しかし、ブラウザでそのリンクに移動すると、すべてが機能します。なぜこれが起こっているのですか?
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>