Android 4.1 的访问控制允许来源错误
Posted
技术标签:
【中文标题】Android 4.1 的访问控制允许来源错误【英文标题】:Access-Control-Allow-Origin Error At Android 4.1 【发布时间】:2012-07-04 08:16:33 【问题描述】:我在 android 4.1 上遇到 Access-Control-Allow-Origin 问题
在我的应用程序中,我有一些本地 html 文件和 javascript,用于从 Web 服务获取数据。在尝试 Android 4.1 之前没有问题,但在尝试 Android 4.1 之后出现此错误。
我阅读了很多文档,但找不到解决此问题的方法。
【问题讨论】:
【参考方案1】:你需要做类似的事情
if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN)
wv.getSettings().setAllowUniversalAccessFromFileURLs(true);
【讨论】:
谢谢,我会试试的。但是 Google API 模拟器没有这个问题;很有趣。 我不想听起来很愚蠢,但是我应该在我的项目中添加这个文件吗? @user1053263 :将它放在您创建 WebView 的任何位置,例如onCreateView
或 onCreate
。你可能还会做wv.getSettings().setJavaScriptEnabled(true)
等。
如果我有api11下的项目怎么办?【参考方案2】:
@我是开发人员和其他面临同样问题的人。
Slushis 解决方案工作正常。但是如果你想编译并支持 API11 以下的系统,你必须添加以下内容:
if (Build.VERSION.SDK_INT >= 16)
Class<?> clazz = webView.getSettings().getClass();
Method method = clazz.getMethod("setAllowUniversalAccessFromFileURLs", boolean.class);
if (method != null)
method.invoke(webView.getSettings(), true);
这将在运行时加载并调用该方法,因此您可以使用例如编译安卓 2.3.3。
【讨论】:
不错的解决方案。是否有任何选项可以在低于 SDK 版本 16 时禁用此属性?【参考方案3】:您的网络服务是否来自同一个域?我曾经在对不同域下的服务进行 ajax 调用时遇到此错误。 如果您可以控制 Web 服务,则可以设置 访问控制允许来源:* 在标题中,(尽管这种方式不是一种安全的方式。)
【讨论】:
其实它们在同一个域中,但在不同的子域中。但我不明白为什么我只收到这个错误 Android 4.1 而不是旧版本?发生了什么变化? 也不允许使用不同的子域。 Chrome 的表现真的很奇怪(我的“get”请求工作正常,但正在将我的“post”请求更改为“OPTIONS”请求),我花了很多时间来找出错误。当我将服务和客户端代码放在同一个子域下时,错误消失了。 这对我来说是不可能的;因为客户端是移动设备 :) 感谢您的帮助。 问题是,如果您从domainname.com/subdomainname 提供服务,您的客户端使用的 url 应该是相同的子域名。这是网址而不是移动设备。 对不起,我听不懂。我的服务安装在 sub.domain.com 上,我正在尝试从移动设备连接它;但由于来源为空并且 Access-Control-Allow-Origin 不允许,我得到了错误。以上是关于Android 4.1 的访问控制允许来源错误的主要内容,如果未能解决你的问题,请参考以下文章