-Edit:找到解决方案
- 在经过一番繁重的搜索后想出来 - 一个人(我的意思是一个人)说他们改为使用onPageLoad(); 这完全符合我的目的.区别在于onPageLoad()的运行时间晚于shouldOverrideUrlLoading,但它对我的代码没有影响.
我正在尝试使用OAuth为Android应用程序设置Twitter授权,到目前为止我可以成功将用户发送到授权URL,但是,我现在要做的是拦截重定向到回调(这只是导致404错误,我们的回调URL不会在我们的服务器上有关联的页面).我要做的是检查URL是否是我们的回调,然后从URL中提取OAuth Verifier.我使用以下代码设置我的WebView:
view = (WebView)findViewById(R.id.twitterWbVw);
view.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView wView, String url)
{
String urlHolder;
String[] verifExtrctr;
urlHolder = url.substring(0, url.indexOf('?'));
System.out.println("url");
if(urlHolder.equalsIgnoreCase(CALLBACK_URL))
{
verifExtrctr = urlHolder.split("?");
verifExtrctr = verifExtrctr[2].split("=");
if(verifExtrctr[0].equalsIgnoreCase("oauth_verifier"))
{
params[5] = verifExtrctr[1];
return true;
}
else
{
System.out.println("Inocorrect callback URL format.");
}
}
else
{
wView.loadUrl(url);
}
return true;
}
});
view.loadUrl(urlAuthorize.toExternalForm());
Run Code Online (Sandbox Code Playgroud)
事情甚至是System.out.println("url"); (我用来调试)不运行!所以我的想法非常枯燥,找不到有类似问题的人.授权URL运行良好,我可以成功授权应用程序,但由于某种原因重定向到回调URL永远不会被截获.任何帮助将不胜感激,这是在我的onResume(),如果这很重要.
我在Android 4.0/4.1上有用户上传崩溃日志,但我无法重现它.日志是这样的:
java.io.IOException: close failed: EIO (I/O error)
libcore.io.IoUtils.close(IoUtils.java:41)
java.io.FileInputStream.close(FileInputStream.java:121)
android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:113)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:949)
java.lang.Thread.run(Thread.java:856)
cause by:
libcore.io.ErrnoException: close failed: EIO (I/O error)
libcore.io.Posix.close(Native Method)
libcore.io.BlockGuardOs.close(BlockGuardOs.java:75)
libcore.io.IoUtils.close(IoUtils.java:38)
java.io.FileInputStream.close(FileInputStream.java:121)
android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:113)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:949)
java.lang.Thread.run(Thread.java:856)
Run Code Online (Sandbox Code Playgroud)
有谁知道它是如何发生的?或者如何解决它?
我正在尝试在Android WebView中使用类似Facebook的功能(项目规范不允许浏览器打开,或任何不在应用程序活动中).
因此,限制是它必须在WebView中完成.我已经设法使它成为一个对话框,并且用户点击按钮,它(WebView)成功(在同一视图中)重定向到facebooks登录页面.身份验证成功后,WebView(在对话框中)将重定向到带有标题的空白页面.
有趣的是,当用户离开空白对话框并再次单击类似按钮时,它的工作方式非常完美(喜欢和不同) - 它以某种方式保持身份验证活动.要解决空白页面,我尝试过/使用过以下内容:
WebViewClient和shouldOverloadUrlForwarding保持整个过程在同一个WebView对话框中.WebChromeClient正确执行JavaScript -登录后没有它不可能喜欢/不象.setUserAgentString()模拟其他浏览器,如Chrome或Firefox尝试了SSL错误证书处理(API级别8)(at WebViewClient)
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
使用(以及所有可能的组合)
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
试图坚持使用饼干CookieSyncManager,CookieManager并手动处理.
所有这一切都没有结果.我非常感谢任何帮助!
目标:
覆盖WebView发出的所有请求并自行发出请求(最终设置代理).
码:
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (url == null || url.trim().equals(""))
return null;
final DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getConnectionManager().closeExpiredConnections();
final HttpUriRequest httpRequest = new HttpGet(url);
try {
final HttpResponse response = httpClient.execute(httpRequest);
final Header[] headers = response.getHeaders(CONTENT_TYPE);
String mimeType = "";
String encoding = "";
if (headers != null && headers.length > 0) {
final String type = headers[0].getValue();
final int semicolonIndex = type.indexOf(';');
if (semicolonIndex != -1) {
mimeType = type.substring(0, semicolonIndex).trim(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的网页加载完成后在Android WebView上执行操作.我设置我的WebView以使用WebViewClient来使用onPageFinished事件回调.但是,经过一些测试后,似乎还没等到页面上的所有JS都在我的onPageFinished代码触发之前完成加载.
Google文档说明了这一点:
public void onPageFinished (WebView view, String url)
Run Code Online (Sandbox Code Playgroud)
在API级别1中添加通知主机应用程序页面已完成加载.仅对主框架调用此方法.调用onPageFinished()时,渲染图片可能尚未更新.要获取新图片的通知,请使用onNewPicture(WebView,Picture).
参数
view正在启动回调的WebView.
url页面的网址.
1)onPageFinished只等待DOM加载吗?
2)有没有办法检测页面上的任何JS何时完成?如果是这样,我应该使用什么?
我没有在WebViewClient中看到任何可能用于此目的的内容.我不想添加延迟,因为我的用户可以在EDGE或LTE上.
我想覆盖onReceivedSslError()一个WebViewClient.在这里,我想检查error.getCertificate()证书是否是从自签名CA签名的,只有在这种情况下,才能调用handler.proceed().在伪代码中:
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
SslCertificate serverCertificate = error.getCertificate();
if (/* signed from my self-signed CA */) {
handler.proceed();
}
else {
super.onReceivedSslError(view, handler, error);
}
}
Run Code Online (Sandbox Code Playgroud)
我的CA的公钥保存在名为的BouncyCastle资源中rootca.bks.我能怎么做?
我在Dialog Activity中实现了WebView,我正在将简单的url加载到webview中.
我的Webview设置如下
wbView = (WebView) findViewById(R.id.wbView);
wbView.setKeepScreenOn(true);
wbView.getSettings().setJavaScriptEnabled(true);
wbView.getSettings().setDomStorageEnabled(true);
wbView.getSettings().setBuiltInZoomControls(true);
wbView.setInitialScale(100);
// wbView.getSettings().setUseWideViewPort(true);
wbView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
wbView.setWebViewClient(new MyWebViewClient());
Run Code Online (Sandbox Code Playgroud)
和MyWebViewClient()包含
private class MyWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
prgBar.setVisibility(View.GONE);
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
Log.e("Error VAGARO", error.toString());
prgBar.setVisibility(View.GONE);
handler.proceed();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我在同一个webview中从Asset中加载两个HTML文件,它工作正常,但无法加载动态URL.
我在Google上找到了http://code.google.com/p/android/issues/detail?id=21177上的一些帖子
我的logcat告诉我
05-09 13:33:30.187: W/webcore(20054): java.lang.Throwable: EventHub.removeMessages(int what = 107) is not …Run Code Online (Sandbox Code Playgroud) 我正在使用WebViewClient.shouldOverrideUrlLoading来捕获WebView中的任何链接点击.这大约有95%的时间都有效,但有时它根本就没有被调用.
我在这三种情况下都注意到了这一点:
shouldOverrideUrlLoading.现在我的问题主要是如何解决问题2,因为其他问题不是很重要.但是,如果有人解决了1或3,我很乐意听到它.
另外,我应该提一下,我已经尝试了不同的返回值,shouldOverrideUrlLoading并且我注意到总是返回true似乎具有最好的结果,但上述问题仍然发生.
我想在我的WebView中打开一个PDF,我在这个论坛上找到并组合了代码.
但是,虽然我安装了多个PDF应用程序,包括Adobe Reader,但它仍然可以找到"找不到PDF应用程序".
这里的代码:
private class PsvWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
if (url.contains(".pdf")) {
Uri path = Uri.parse(url);
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(path, "application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try
{
startActivity(pdfIntent);
}
catch(ActivityNotFoundException e)
{
Toast.makeText(PsvWebViewActivity.this, "No PDF application found", Toast.LENGTH_SHORT).show();
}
catch(Exception otherException)
{
Toast.makeText(PsvWebViewActivity.this, "Unknown error", Toast.LENGTH_SHORT).show();
}
}
return true;
} } }
Run Code Online (Sandbox Code Playgroud) 这是我的代码
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView)findViewById(R.id.webView);
// Assign webclient.
webView.setWebViewClient(new WebViewClient( ) {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
Log.d("TAG", url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Log.d("TAG", "failed: " + failingUrl + ", error code: " + errorCode + " [" + description + "]");
}
});
webView.loadUrl("http://m.vooglemoogle.com" );
}
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
03-29 13:40:27.005: DEBUG/TAG(10948): …Run Code Online (Sandbox Code Playgroud) android ×10
webviewclient ×10
webview ×3
ca ×1
facebook ×1
https ×1
pdf ×1
self-signed ×1
toast ×1