由于默认浏览器,Android 无法在 web 视图中实现 facebook 评论

Posted

技术标签:

【中文标题】由于默认浏览器,Android 无法在 web 视图中实现 facebook 评论【英文标题】:Android unable to implement facebook comment in a webview due to default browser 【发布时间】:2012-01-24 12:38:19 【问题描述】:

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

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

我要做的是模拟浏览器的工作过程,即用户登录时,他/她会自动获得添加facebook评论的权限。

我的问题:

我不知道如何从浏览器获取所有身份验证并将其重定向回我的应用程序 web 视图。我想要的是在我的应用程序 webview 中完成所有过程,而不是使用默认浏览器。

我检查了所有堆栈溢出问题,其中大多数建议使用 Facebook 连接和 Facebook android SDK 等开源 Facebook 插件。此外,我得到了一些关于CookieManagerCookieSyncManagerWebViewClientWebChromeClient 的信息,但我无法解决我的问题。我找到的最接近的是:

How to handle facebook like with confirm in android webview

各位,如果你们能指出我正确的方向,我会非常高兴。我仍在尝试了解如何在 webview 上进行所有操作,如果有任何事情发生,我一定会发布。

提前致谢

更新

我只能实现facebook登录,但无法实现AOLHotmailYahoo登录。对于 facebook 登录只需创建一个自定义 WebViewClient 和方法 shouldOverrideUrlLoading

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

return false;

为了允许多次登录,我实现了以下技术,但它不起作用

 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;

我仍在尽我所能找到解决方案,任何人都会在正确的方向指导我,我将不胜感激。 在此先感谢

【问题讨论】:

【参考方案1】:

提供的答案 How to handle facebook like with confirm in android webview 是迄今为止我找到的最好的解决方案。我了解到的是 Android WebView 默认情况下不会加载 html 视图的弹出窗口,为此我们需要使用处理所有这些的 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 所要做的全部事情,如果有人发现其中有任何缺陷,那么我很乐意纠正它。希望这个解决方案能为任何陷入困境的开发人员节省时间和时间像我一样;)

【讨论】:

我需要安装任何jar到lib文件夹吗? 登录后一直刷新页面。 @Minion 你有没有解决登录后刷新问题的方法?我面临与上述代码相同的问题。如果您对此有任何解决方案,请帮助我。 @jaydroider 关注本文androidhive.info/2016/09/…

以上是关于由于默认浏览器,Android 无法在 web 视图中实现 facebook 评论的主要内容,如果未能解决你的问题,请参考以下文章

android通过webview访问通过Html5定位的web页面无法获取到经纬度

由于“跨源请求”,YouTube 在 web 视图中播放失败

使用视 meta 标签来控制手机浏览器布局

Android进程间通信详细介绍

Web 视图无法加载特定 URL(Web 工具包错误域 102)

如何构造 FCM 推送通知以在 Flutter(Android 和 iOS)的默认系统 Web 浏览器应用中打开指定的 URL