由于默认浏览器,Android无法在webview中实现Facebook评论

我是Android开发的新手,这个webview和webview客户端正在杀死我。 这是我的场景:

  1. 我必须加载一个包含Facebook社交插件(用于评论该特定url)的网页,我正在使用WebView
  2. 当用户使用Facebook点击评论时,他/她将在同一个webview上被授予login页面(而不是打开默认浏览器
  3. 一旦login成功,将显示第一页(包含社交插件的页面),允许用户发表评论

我所要做的是模拟浏览器的工作过程,即用户login时,他/她被自动授予添加Facebook评论的权限。

我的问题:

我不知道如何从浏览器获得所有的身份validation,并将其redirect回我的应用程序的web视图。 我想要的是在我的应用程序webview中执行所有的过程,而不是去默认的浏览器。

我已经检查了所有的堆栈溢出问题,他们中的大多数人build议使用Facebook连接和Facebook android SDK等开源的Facebook插件。 此外,我得到了一些关于CookieManagerCookieSyncManagerWebViewClientWebChromeClient但我无法实现我的问题。 而我发现的最接近的是:

如何在android webview中处理facebook

所以,如果你能指出我正确的方向,我会很高兴。 我仍然试图了解如何在web视图上执行所有操作,如果发生任何问题,我一定会发布。

提前致谢

更新

我只能实现facebooklogin,但不能实现AOLHotmailYahoologin。 对于facebooklogin只需创build一个自定义的WebViewClient和方法shouldOverrideUrlLoading

 if(url.contains("https://www.facebook.com/connect/window_comm.php")){ webView.clearHistory(); webView.loadUrl(remoteUrl); } return false; 

为了允许多个login我已经实现了以下技术,但它不工作

  if(url.contains("https://www.facebook.com/connect/window_comm.php")){ String cookieString = cookieManager.getCookie("facebook.com"); if(cookieString != null){ cookieManager.setCookie("remoteUrldomain.com", cookieString); CookieSyncManager.getInstance().sync(); webView.clearHistory(); webView.loadUrl(remoteUrl); } } return false; 

我仍然在尽力find解决办法,那里的任何人都会引导我以正确的方向感谢。 提前致谢

提供的答案如何处理facebook像在android webview中确认是迄今为止发现的最好的解决scheme。我所学到的是, Android WebView不会默认加载HTML视图的popup窗口,为此我们需要使用WebChromeClient它处理所有这些。查看下面的代码

  private String requestUrl="some web link containing facebook social comment"; private WebView webView,childView =null; private LinearLayout parentLayout; private Activity MyActivity; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); this.getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.main); getWindow().setFeatureInt(Window.FEATURE_PROGRESS,Window.PROGRESS_VISIBILITY_ON); parentLayout =(LinearLayout)findViewById(R.id.parentLayout); MyActivity = this; webView = new WebView(this); webView.setLayoutParams(getLayoutParams()); webView.setWebViewClient(new FaceBookClient()); webView.setWebChromeClient(new MyChromeClient()); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webView.getSettings().setSupportMultipleWindows(true); webView.getSettings().setSupportZoom(true); webView.getSettings().setBuiltInZoomControls(true); parentLayout.addView(webView); webView.loadUrl(requestUrl); } private LinearLayout.LayoutParams getLayoutParams(){ return new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); } final class MyChromeClient extends WebChromeClient{ @Override public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) { childView = new WebView(SmCommentTestActivity.this); childView.getSettings().setJavaScriptEnabled(true); childView.getSettings().setSupportZoom(true); childView.getSettings().setBuiltInZoomControls(true); childView.setWebViewClient(new FaceBookClient()); childView.setWebChromeClient(this); childView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); parentLayout.addView(childView); childView.requestFocus(); webView.setVisibility(View.GONE); /*I think this is the main part which handles all the log in session*/ WebView.WebViewTransport transport =(WebView.WebViewTransport)resultMsg.obj; transport.setWebView(childView); resultMsg.sendToTarget(); return true; } @Override public void onProgressChanged(WebView view, int newProgress) { MyActivity.setProgress(newProgress*100); } @Override public void onCloseWindow(WebView window) { parentLayout.removeViewAt(parentLayout.getChildCount()-1); childView =null; webView.setVisibility(View.VISIBLE); webView.requestFocus(); } } private class FaceBookClient extends WebViewClient{ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.i("REQUEST URL",url); return false; } } @Override public void onBackPressed() { if(childView != null && parentLayout.getChildCount()==2){ childView.stopLoading(); parentLayout.removeViewAt(parentLayout.getChildCount()-1); if(webView.getVisibility() == View.GONE) webView.setVisibility(View.VISIBLE); }else{ super.onBackPressed(); } } 

这是在Android WebView上实现Facebook Social Comment Plugin要做的一切,如果有人发现它有任何缺陷,那么我会很乐意去纠正它。希望这个解决scheme能够节省时间和麻烦,像我这样的开发人员。 )