所以我在我的android项目中运行了一个json请求,其中包含了指向图像"http:\/\/s2.dmcdn.net\/qhQ5Y.jpg
“的url字符串。
在我的AS AVD API 25上,它会自动删除"\“字符并正确加载图像(使用picasso进行网络图像加载),但在AVD API 27中会抛出错误。我假设是因为"\“不会自动被忽略,因为没有"\”的相同url会在任何web浏览器中正确加载图像。
问:我如何才能在所有最新的(23+)安卓设备上运行?是毕加索的问题,还是Android版本加载网络呼叫的方式不同?
发布于 2018-10-07 23:23:19
我通过将保存的字符串url改为不带反斜杠的方法修复了这个问题。
String thumburl = (videoJsonObj.getString("thumbnail_url"));
thumburl = thumburl.replace("\'", "");
现在这在我的所有AVD API级别上都有效。我仍然想知道为什么毕加索在API 25上默认纠正了这一点,而不是API 27或28。这些Android版本和毕加索一起加载URL资源的方式有什么不同?
更新:我说得太早了.它似乎仍然不能在AS模拟器上运行新的Android版本(Pie)。经过一些挖掘和大量的日志记录,我意识到发生了一些事情:
首先,当JSONObject.getString()
方法使用键从JSON检索URL值时,它似乎会自动删除"\“。在此提取后记录该值,即使没有上面的代码,也会显示没有反标记的url。(仍然很好,以防系统不会自动发生这种情况。)
因此,真正的问题出在Android Pie的新功能上,默认情况下会阻止所有http流量。您可以在应用程序中绕过此功能,如here所示
或者,假设您正在访问的站点具有https
地址,您可以进行一系列字符串操作,以在默认情况下确保应用程序的网络调用更安全,但由于某些原因,默认情况下在其JSON响应中返回http
结果,就像我的例子一样。
我选择将其保留为https,因为这是未来的趋势,如果它不存在于我的结果中,则添加'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
地址,它不会中断,因为它会在正确的位置检查's‘字符;但是,它也会强制加载https
版本(因为这是web未来的趋势),这可能不适用于过时的站点/数据源。(这对我来说很有效,因为在我的例子中,这个网站。https://s1.dmcdn.net/p0i-5.jpg
和http://s1.dmcdn.net/p0i-5.jpg
都返回相同的结果。)
https://stackoverflow.com/questions/52689809
复制相似问题