Android не может добавить комментарий в Facebook из-за браузера по умолчанию - PullRequest
7 голосов
/ 20 декабря 2011

Я новичок в разработке для Android, и этот клиент для веб-просмотра и веб-просмотра убивает меня.Это мой сценарий:

  1. Мне нужно загрузить веб-страницу, которая содержит плагин социальной сети Facebook (используется для комментирования этого конкретного URL), и я использую WebView для него
  2. Когда пользовательнажимает на комментарий с помощью Facebook, ему / ей должна быть предоставлена ​​страница входа в тот же веб-просмотр (вместо открытия браузера по умолчанию)
  3. И после успешного входа в систему должна быть открыта первая страница (содержащая социальный плагин).отображается, позволяя пользователю комментировать

Что мне нужно сделать, так это эмулировать рабочий процесс браузера, т.е. пользователю, когда он входит в систему, ему / ей автоматически предоставляется разрешение на добавление комментария на Facebook.

Моя проблема:

Я не знаю, как получить всю аутентификацию из браузера и перенаправить ее обратно в веб-просмотр моего приложения.Я хочу выполнить весь процесс в веб-просмотре моего приложения, а не в браузере по умолчанию.

Я проверил все вопросы о переполнении стека, и большинство из них советуют использовать плагины Facebook с открытым исходным кодом, такие как Facebook connect и FacebookAndroid SDK.Кроме того, я получил некоторую информацию о CookieManager, CookieSyncManager, WebViewClient, WebChromeClient, но я не смог реализовать свою проблему.И самое близкое, что я нашел, это:

Как работать с Facebook, как с подтверждением в веб-просмотре Android

Так что, если бы вы могли указать мне в правильном направлении, я быбудь очень рад.Я все еще пытаюсь понять, как выполнить все действия в веб-просмотре, и если что-нибудь произойдет, я обязательно напишу.

Заранее спасибо

Обновление

Я мог реализовать только facebook логин, но не смог реализовать AOL, Hotmail и Yahoo логин.Для 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 Ответ

11 голосов
/ 28 декабря 2011

Ответ предоставлен на Как работать с Facebook, как с подтверждением в 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();
    }
}

Это все, что нужно сделать для реализации Facebook Social Comment Plugin на Android WebView, и если кто-то обнаружит в нем какой-либо недостаток, я был бы рад его исправить. И надеюсь, это решение сэкономит и время на любом проблемном разработчике. как я;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...