Android Api 特定 url 默认值
Posted
技术标签:
【中文标题】Android Api 特定 url 默认值【英文标题】:Android Api specific url defaults 【发布时间】:2019-03-12 09:20:34 【问题描述】:所以我在我的 android 项目中运行一个 json 请求,其中包含类似这样的内容,用于图像“http:\/\/s2.dmcdn.net\/qhQ5Y.jpg
”的 url 字符串
在我的 AS AVD API 25 上,它会自动删除“\”字符并正确加载图像(使用 picasso 进行网络图像加载),但在 AVD API 27 中会引发错误。我假设是因为“\”不会被自动忽略,因为没有“\”的相同网址可以在任何网络浏览器中正确加载图像。
问题:如何简化它以在所有最新 (23+) android 设备上工作?是毕加索的问题还是安卓版本加载网络调用的方式不同?
【问题讨论】:
反斜杠是java中的转义字符。要将反斜杠作为反斜杠,您必须将其加倍。 \\ 代替 \。无论如何,您如何解码 json 字符串,因为库会照顾或正确地做到这一点。 我制作了自己的实用程序,将字符串保存到一个对象中,毕加索通过从保存的对象中获取字符串来加载该图像。因此,该 url 被保存为“http:\/\/s2.dmcdn.net\/qhQ5Y.jpg”,在浏览器中无法正确加载,但 Picasso 在 API 25 中可以正常加载。 【参考方案1】:我通过将保存的字符串 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
地址,但由于某种原因,默认情况下在其 JSON 响应中返回 http
结果,您可以执行一系列字符串操作以确保应用程序的网络调用更安全,就像我的情况一样。
如果我的结果中不存在“s”,我选择通过以下字符串操作将其保留为 https,因为那是未来:
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
版本(因为这是网络的未来趋势),这可能不适用于过时的站点/数据源。 (这对我有用,因为在我的情况下这个站点。https://s1.dmcdn.net/p0i-5.jpg
和 http://s1.dmcdn.net/p0i-5.jpg
都返回相同的结果。)
【讨论】:
以上是关于Android Api 特定 url 默认值的主要内容,如果未能解决你的问题,请参考以下文章