jty*_*ann 13 android callback android-3.0-honeycomb android-4.0-ice-cream-sandwich cordova
我有一个困扰我好几天的问题.事实证明,这是一个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>
为什么有人想要这样做,因为文件显然无法对查询值做任何事情?好吧,我有一个通过JSONP加载设置文件的phonegap应用程序,但是如果没有指定设置文件,它默认为本地文件.所以是的,文件无法处理查询数据,但使用相同的文件格式和加载结构会很好.
因此,如果目标android平台是11(Honeycomb)或更高,那么有一个简单的解决方案.(只要您小心并且不使用任何较低API级别中不存在的任何方法,此代码将在<11 apis上运行,但您仍需将11设置为目标)
基本上,您将WebViewClient添加到WebView,该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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
要设置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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在对于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;
}
}
Run Code Online (Sandbox Code Playgroud)
希望这个解决方案可以很容易地包含类或调整到主活动,这样你就可以使用手机间隙,但只能使用代码的.jar文件,使升级更容易.
查询数据附加到 javascript 文件(以及其他文件类型,如 css)以防止浏览器缓存。查询数据对文件没有用处,但浏览器将其视为新文件,因为位置已更改(在浏览器看来)并且加载了新副本。
我很高兴你找到了问题的答案,只是想我会就人们为什么使用这种方法给出我的意见。
| 归档时间: |
|
| 查看次数: |
6876 次 |
| 最近记录: |