Jetpack Compose中使用Coil加载Google Books API返回的图书封面图片失败求助
嘿,我最近在做一个Jetpack Compose的图书APP,用Google Books API拉取图书信息和封面,但遇到个头疼的问题——用Coil加载API返回的图片URL时,封面死活显示不出来。换其他非Google的图片URL就完全正常,有没有大佬遇到过类似情况呀?
下面是我用到的代码片段:
Image( painter = rememberAsyncImagePainter(book.imageUrl), contentDescription = book.name, modifier = Modifier .clip(RoundedCornerShape(4.dp)) .size(60.dp), contentScale = ContentScale.Crop )
我试过用AsyncImage,也换过Glide,API返回的图片URL确实拿到手了,但就是显示不出来。举个例子,我用的其中一个URL是:http://books.google.com/books/content?id=-q0reoyIO30C&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
可能的解决方案
我后来查了相关资料,大概率是明文HTTP请求被Android系统拦截的问题!因为从Android 9(API 28)开始,系统默认禁止App使用明文HTTP请求,而Google Books API返回的这个图片URL是http开头的,不是https。给你几个可行的解决办法:
配置网络安全规则,允许特定域名的明文请求:
在项目的res/xml目录下创建network_security_config.xml文件,内容如下:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">books.google.com</domain> </domain-config> </network-security-config>接着在
AndroidManifest.xml的application标签里添加该配置:<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>确认网络权限已正确添加:
检查AndroidManifest.xml中是否包含网络权限,这是加载网络图片的基础:<uses-permission android:name="android.permission.INTERNET" />尝试将HTTP链接改为HTTPS:
你可以试试把图片URL里的http替换成https,部分Google Books的图片链接支持HTTPS协议,这样就能绕过明文请求的限制,不用修改网络配置。验证URL的可访问性:
把问题URL复制到浏览器中打开,确认图片是否能正常显示。如果浏览器也无法加载,那可能是API返回的URL存在问题,需要检查请求参数是否正确。
备注:内容来源于stack exchange,提问作者Daniel Ferreira

