Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android unable to implement facebook comment in a webview due to default browser

I am newbie to Android development and this webview and webview client is killing me. This is my scenario:

  1. I have to load a web page which contains facebook social plugin (used for commenting on that particular url) and I am using WebView for it
  2. When user clicks comment using Facebook, he/she is to be given login page on same webview (instead of opening default browser)
  3. And once the login is successful, the first page (the one containing social plugin) is to be displayed allowing user to comment

What I have to do is emulate the working process of browser i.e. the user when logs in, he/she is automatically granted permission to add facebook comment.

My problem:

I don't know how to get all the authentication from browser and redirect it back to my app webview. What I want is to do all the process in my app webview rather than going to default browser.

I have checked all the stack overflow questions and most of them advise on using open source Facebook plugins like Facebook connect and Facebook android SDK. Further I got some info on CookieManager, CookieSyncManager, WebViewClient, WebChromeClient but I couldn't implement on my issue. And the closest I found is this:

How to handle facebook like with confirm in android webview

So folks if you could point me in the right direction, I would be very glad. I am still trying to understand on how to make all the action on a webview and if anything comes I will surely post.

Thanks in advance

Update

I could only implement facebook login but couldn't implement AOL,Hotmail and Yahoo login. For facebook login just create a custom WebViewClient and on method shouldOverrideUrlLoading

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

To allow multiple login I have implemented following technique but it doesn't work

 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;

I am still doing my best to find the solution, and anybody out there would guide me in proper direction that would be grateful . Thanks in advance

like image 256
laaptu Avatar asked Dec 20 '11 14:12

laaptu


People also ask

Which browser is used in Android WebView?

Chrome, Google's ubiquitous browser, powers Android System WebView. The Android System WebView app is typically pre-installed on most Android smartphones. That way, every developer that resorts to using it to render internet content inside their app can do so without warning about compatibility issues.

How do I enable JavaScript on Android WebView?

JavaScript is disabled in a WebView by default. You can enable it through the WebSettings attached to your WebView . You can retrieve WebSettings with getSettings() , then enable JavaScript with setJavaScriptEnabled() . WebView myWebView = (WebView) findViewById(R.

What is alternative of WebView in android?

Alternatives to WebView If you want to send users to a mobile site, build a progressive web app (PWA). If you want to display third-party web content, send an intent to installed web browsers. If you want to avoid leaving your app to open the browser, or if you want to customize the browser's UI, use Custom Tabs.

Is Android WebView deprecated?

This interface was deprecated in API level 12. This interface is now obsolete.


1 Answers

The answer provided on How to handle facebook like with confirm in android webview is the best solution I have found so far.What I learnt is that Android WebView doesn't by default load the popup of html views and for that we need to use WebChromeClient which handles all these.Look at the following code

 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();
    }
}

This is all one has to do to implement Facebook Social Comment Plugin on Android WebView and if somebody finds any flaw in it,then I would be happy to correct it.And hope,this solution would save and time on any troubled developer like me ;)

like image 146
laaptu Avatar answered Sep 22 '22 13:09

laaptu