所以我在我的android项目中运行了一个json请求,其中包含类似于“ http:\/\/s2.dmcdn.net\/qhQ5Y.jpg
”图像的url字符串
在我的AS AVD API 25上,它会自动删除“ \”字符并正确加载图像(使用Picasso加载网络图像),但是在AVD API 27中,它将引发错误。我假设是因为不会自动忽略“ \”,因为没有任何“ \”的相同网址会在任何网络浏览器中正确加载图片。
问题:如何简化此流程,使其可在所有最新的(23+)安卓设备上使用?是Picasso出现问题,还是Android版本加载网络通话的方式有所不同?
答案 0 :(得分:0)
我通过将保存的字符串url更改为不带反斜杠的url来解决了该问题
String thumburl = (videoJsonObj.getString("thumbnail_url"));
thumburl = thumburl.replace("\'", "");
这现在可以在我所有的AVD API级别上使用。我仍然想知道为什么Picasso默认在API 25而不是API 27或28上对此进行了纠正。那些Android版本和Picasso一起加载URL资源的方式有何不同?
更新:我讲得太早了……看来在AS模拟器上的新Android版本(Pie)上仍然无法使用。经过一些挖掘和大量日志记录后,我意识到正在发生一些事情:
首先,当JSONObject.getString()
方法使用密钥从JSON检索url值时,它似乎会自动删除“ \”。在提取之后记录值时,即使没有上述代码,URL也不会带有反引号。 (以防万一系统不会自动发生它仍然很不错。)
因此,真正的问题在于Android Pie的新功能默认情况下会阻止所有http流量。您可以在应用中绕过此功能,如图here
或者,假设您访问的站点具有https
个地址,默认情况下,您可以做一堆字符串操作以使应用程序的网络调用更安全,但是由于某种原因,默认情况下,返回http
他们的JSON响应,就像我的情况一样。
我选择将其保留为https,因为如果将来使用以下字符串操作在结果中不存在“ s”,则添加“ s”:
String thumburl = (videoJsonObj.getString("thumbnail_url"));
thumburl = thumburl.replace("\'", "");
StringBuilder imageUrlStringBuilder = new StringBuilder(thumburl);
if(imageUrlStringBuilder.charAt(4) != 's') {
imageUrlStringBuilder.insert(4, 's');
}
thumburl = imageUrlStringBuilder.toString();
video.setVideoThumbnailUrl(thumburl);
我相信这种字符串操作是一种更好的方法,因为如果API更新为返回https
而不是当前返回的http
地址,它不会中断,因为它会检查的人物在正确的位置;但是,这也会强制加载https
版本(因为这是Web的未来趋势),这可能不适用于过时的站点/数据源。 (这对我有用,因为在我的情况下,此站点。https://s1.dmcdn.net/p0i-5.jpg
和http://s1.dmcdn.net/p0i-5.jpg
都返回相同的结果。)