- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了一个困扰我好几天的问题。事实证明这是一个 Android 故障,已经提交、确认,并希望在未来的版本中得到修复。现在我找到了适合我的解决方案,并将在下面提供,但是该解决方案并不完美,因为它涉及编辑手机间隙源。我的主要问题是是否有人可以找到更好的解决方案来解决这个问题。
错误:
当您尝试在 Android 3.0+ 上的 WebView 中加载页面时会出现故障。问题在于,如果该页面引用任何本地 javascript 文件,则无法将查询数据附加到 url。基本上
这个有效:
<script type="text/javascript" src="StaticJS.js"></script>
这不起作用:
<script type="text/javascript" src="StaticJS.js?var=val"></script>
既然文件显然不能对查询值做任何事情,为什么有人要这样做呢?对我来说,我有一个 phonegap 应用程序,它通过 JSONP 加载设置文件,但是如果未指定设置文件,它默认为本地文件。是的,该文件无法处理查询数据,但最好使用相同的文件格式和加载结构。
因此,如果目标 android 平台是 11(Honeycomb) 或更高版本,则有一个简单的解决方案。 (只要您小心并且不使用任何较低 API 级别中不存在的方法,此代码将在 <11 api 上运行,但您仍然必须将 11 设置为目标)
基本上,您将 WebViewClient 添加到 WebView,它利用 shouldInterceptRequest 方法来拦截加载附加查询数据的本地 js 文件。
import java.io.IOException;
import java.io.InputStream;
import android.content.res.AssetManager;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class PatchingWebViewClient extends WebViewClient{
AssetManager am;
public PatchingWebViewClient(AssetManager am){
this.am = am;
}
@Override
public WebResourceResponse shouldInterceptRequest (WebView view, String url){
if(url.indexOf("file:///android_asset") == 0 && url.contains("?")){
String filePath = url.substring(22, url.length());
filePath = filePath.substring(0, filePath.indexOf("?"));
try {
InputStream is = am.open(filePath);
WebResourceResponse wr = new WebResourceResponse("text/javascript", "UTF-8", is);
return wr;
} catch (IOException e) {
return null;
}
}else{
return null;
}
}
}
要设置 WebViewClient,您的代码应如下所示:
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
public class CanWeBreakAWebViewActivity extends Activity {
WebView mWebView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new PatchingWebViewClient(this.getAssets()));
mWebView.loadUrl("file:///android_asset/index.html");
}
}
现在对于 Phonegap,我没有一个干净的解决方案。我的解决方案是下载 Phonegap 源代码并通过添加以下方法编辑 CordovaWebViewClient:
@Override
public WebResourceResponse shouldInterceptRequest (WebView view, String url){
if(url.indexOf("file:///android_asset") == 0 && url.contains("?")){
String filePath = url.substring(22, url.length());
filePath = filePath.substring(0, filePath.indexOf("?"));
try {
InputStream is = ctx.getAssets().open(filePath);
WebResourceResponse wr = new WebResourceResponse("text/javascript", "Cp1252", is);
return wr;
} catch (IOException e) {
return null;
}
}else{
return null;
}
}
希望这个解决方案可以很容易地包含类或对主要 Activity 进行调整,这样您就可以使用手机间隙,但可以只使用代码的 .jar 文件,从而使升级更容易。
最佳答案
感谢这篇文章,您让我了解了最新的解决方案,即使用 IceCream Cordova WebViewClient。
@Override
public void init() {
super.init(webView, new IceCreamCordovaWebViewClient(this, webView), new CordovaChromeClient(this, webView));
}
关于android - 在 webview 中加载本地 javascript 文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9302306/
我是一名优秀的程序员,十分优秀!