Cordova Android跨域异常求助:DroidGap加载本地HTML报错
我明白你作为Cordova新手遇到的困扰——既要解决跨域错误,又要处理appView的空指针异常,还不想依赖本地服务器。咱们一步步来解决:
首先,为什么会出现NullPointerException?
你在super.onCreate(savedInstanceState)之后直接调用super.appView.getSettings()会报错,是因为此时appView还未完成初始化。DroidGap的onCreate方法里,appView的初始化是在后续流程中完成的,提前调用就会拿到null对象。
解决方案1:修正Activity代码,确保WebView初始化后再配置
你可以先调用super.init()来确保appView被初始化,再修改设置,最后加载页面:
public class MainActivity extends DroidGap { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 先初始化WebView,避免空指针 super.init(); // 配置WebView允许本地文件访问 WebSettings settings = super.appView.getSettings(); settings.setAllowFileAccess(true); settings.setAllowFileAccessFromFileURLs(true); settings.setAllowUniversalAccessFromFileURLs(true); // 加载本地HTML文件 super.loadUrl("file:///android_asset/www/MyHtml.html"); } }
解决方案2:更推荐的方式——用Cordova配置文件(config.xml)管理
手动修改Activity代码不是Cordova的最佳实践,你可以通过项目根目录下的config.xml来配置,避免代码层面的错误:
添加以下配置项,让Cordova自动处理本地文件的跨域权限:
<!-- 允许访问所有本地文件路径 --> <access origin="file:///*" /> <!-- 允许文件访问 --> <preference name="AllowFileAccess" value="true" /> <!-- 允许从file://URL加载的脚本访问其他file://URL --> <preference name="AllowUniversalAccessFromFileURLs" value="true" />
添加后,你的Activity代码可以简化为:
public class MainActivity extends DroidGap { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.loadUrl("file:///android_asset/www/MyHtml.html"); } }
额外提醒:检查Cordova版本兼容性
注意DroidGap是Cordova较旧版本的类,新版本已经改用CordovaActivity。如果你的Cordova版本较新,建议替换为:
public class MainActivity extends CordovaActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 启用Cordova的WebView设置 loadUrl(launchUrl); } }
此时launchUrl默认指向file:///android_asset/www/index.html,你可以在config.xml里通过<content src="MyHtml.html" />修改默认加载的页面。
最后确认HTML文件路径
确保你的HTML文件确实放在assets/www/MyHtml.html目录下,文件名大小写匹配(Android对文件名大小写敏感)。如果HTML里引用了其他本地资源,尽量使用相对路径(比如./css/style.css)而不是绝对file://路径,减少跨域风险。
内容的提问来源于stack exchange,提问作者Tushar Deshpande

