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.jpghttp://s1.dmcdn.net/p0i-5.jpg 都返回相同的结果。)

【讨论】:

以上是关于Android Api 特定 url 默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Holo 主题 Api 11-17 Android 中以编程方式将 EditText 背景设置为默认值

bootstrap select2怎么设置默认值

Kendo Ui 组合框 - 设置默认值

django URL的补充 默认值 传多个参数

根据项目特定设置函数默认值 R

vue中给的默认值是调接口取到的