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

Я пытаюсь реализовать функциональность, похожую на facebook, с помощью веб-просмотра Android. Он отлично работает без диалога «подтвердить». Но это не работает, когда лайк требует подтверждения. Вот фрагмент кода, который я использую.

    private void setUpWebView() {
    likeWebView.setVerticalScrollBarEnabled(false);
    likeWebView.setHorizontalScrollBarEnabled(false);
    likeWebView.setWebViewClient(new FacebookWebViewClient());
    likeWebView.setWebChromeClient(new MyChromeClient());
    likeWebView.getSettings().setJavaScriptEnabled(true);
     String url = getFacebookLikeUrl();
    likeWebView.loadUrl(url);
 }

Я также устанавливаю ViewClient и WebChromeClient.

private String getFacebookLikeUrl() {
    return "http://www.facebook.com/plugins/like.php?" + "href="
            + URLEncoder.encode(mUrl) + "&access_token="
            + URLEncoder.encode(facebook.getAccessToken());
}

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.


person Shweta    schedule 20.09.2011    source источник
comment
Я решил эту проблему, избавившись от метода onCreateWindow() WebChromeClient и включив эти два параметра для веб-просмотра. LikeWebView.getSettings().setJavaScriptCanOpenWindowsАвтоматически (истина); LikeWebView.getSettings().setSupportMultipleWindows(true); Спасибо всем.   -  person Shweta    schedule 10.10.2011
comment
вы должны опубликовать это как ответ и принять свой собственный ответ, чтобы другие могли легко узнать об этом.   -  person MKJParekh    schedule 03.11.2011


Ответы (2)


Подтверждение лайка в Facebook открывает в новом окне подтверждение виджета. Таким образом, ваш веб-просмотр должен поддерживать открытие нескольких окон. для этого setJavaScriptCanOpenWindowsAutomatically(true) и setSupportMultipleWindows(true) для вашего webview-

 private void setUpWebView() {
    likeWebView = new WebView(getContext());
    likeWebView.setWebViewClient(new FacebookWebViewClient());
    likeWebView.setWebChromeClient(new MyChromeClient());
    final WebSettings webSettings = likeWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    webSettings.setSupportMultipleWindows(true);
    String url = getFacebookLikeUrl();
    likeWebView.loadUrl(url);
    likeWebView.setLayoutParams(FILL);
    mContent.addView(likeWebView);
}

Facebook как подтверждение вызывает метод onCreateWindow(). ТАК переопределить метод onCreateWindow в WebChromeClient -

final class MyChromeClient extends WebChromeClient {

    // Add new webview in same window
    @Override
    public boolean onCreateWindow(WebView view, boolean dialog,
            boolean userGesture, Message resultMsg) {
        WebView childView = new WebView(getContext());
        childView.getSettings().setJavaScriptEnabled(true);
        childView.setWebChromeClient(this);
        childView.setWebViewClient(new FacebookWebViewClient());
        childView.setLayoutParams(FILL);
        mContent.addView(childView);
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(childView);
        resultMsg.sendToTarget();
        return true;
    }

    // remove new added webview whenever onCloseWindow gets called for new webview.
    @Override
    public void onCloseWindow(WebView window) {
        mContent.removeViewAt(mContent.getChildCount() - 1);
    }
}

confirm_widget для подобных вызовов onCloseWindow, когда пользователь нажимает «Нравится» или «Отмена». В этом методе удалите последний добавленный веб-просмотр.

person Shweta    schedule 05.11.2011
comment
Не могли бы вы сказать, является ли ваш код решением моей проблемы facebook.stackoverflow.com/questions/16829600/ - person Suresh Sharma; 30.05.2013
comment
Привет, я сделал то же самое (более или менее). Но происходит сбой между Android 4.0 и Android 4.3 (работает только в Android 4.4 и выше). Сбой является родным [фатальный сигнал 11 (SIGSEGV) по адресу 0xdeadd00d (код = 1), поток 1637 (WebViewCoreThre)]. А перед этим вижу это предупреждение Invalid косвенная ссылка 0xa74a9fd0 в decodeIndirectRef. Это работает для вас на Android 4.1/4.2/4.3? - person Daniele Segato; 15.09.2014

Я использовал это для Stripe Checkout, который открывает новое окно для платежей на мобильных устройствах.

На основе ответа @Shweta:

В вашей деятельности:

package myapp.app;
/*** imports ***/

public class LoggedActivity extends FragmentActivity
{
    public WebView myWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.logged);

        // retrieve the main container
        LinearLayout container = (LinearLayout) findViewById(R.id.logged_webviews_container);

        // layout params applied to the webviews in order to fit 100% the parent container
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);

        myWebView = new WebView(this);
        myWebView.setLayoutParams(layoutParams);
        myWebView.setWebViewClient(new BetterWebViewClient(this));

        WebSettings settings = myWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        settings.setSupportMultipleWindows(true);

        // on this instruction, we set our extended class below as the Parent Webview webchromeclient
        myWebView.setWebChromeClient(new PopupWebView(this, myWebView, container, layoutParams));

        // load URL
        myWebView.loadUrl('http://www.mywebsite.com');
        container.addView(myWebView);
    }

}

Добавьте этот класс, который расширяет WebChromeClient

package myapp.app;
/*** imports ***/

public class PopupWebChromeClient extends WebChromeClient {

    protected Activity activity;
    protected WebView parentWebView;
    protected RelativeLayout container;
    protected WebView popupView;

    PopupWebChromeClient(
        Activity activity,
        WebView parentWebView,
        RelativeLayout container
    )
    {
        super();
        this.activity = activity;
        this.parentWebView = parentWebView;
        this.container = container;
    }

    @Override
    public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) {

        this.parentWebView.setVisibility(WebView.GONE);

        this.popupView = new WebView(this.activity);

        // setup popuview and add
        this.popupView.getSettings().setJavaScriptEnabled(true);
        this.popupView.setWebChromeClient(this);
        this.popupView.setWebViewClient(new ApkfWebViewClient(this.activity, true));
        this.popupView.setLayoutParams(new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.FILL_PARENT,
            RelativeLayout.LayoutParams.FILL_PARENT
        ));
        this.container.addView(this.popupView);

        // send popup window infos back to main (cross-document messaging)
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(popupView);
        resultMsg.sendToTarget();

        return true;
     }

    // remove new added webview on close
    @Override
    public void onCloseWindow(WebView window) {
        this.popupView.setVisibility(WebView.GONE);
        this.parentWebView.setVisibility(WebView.VISIBLE);
    }


}

В вашем макете xml не устанавливайте веб-просмотры, так как мы создаем их на лету.

person younes0    schedule 28.01.2014
comment
это было довольно полезно, но у меня есть один вопрос, можете ли вы сказать мне, что такое содержимое ApkfWebViewClient и где вы его определили? - person HiDd3N; 19.01.2021
comment
хороший улов! ApkfWebViewClient является дочерним классом WebViewClient (с пользовательскими параметрами shouldOverrideUrlLoading, onPageStarted, onPageFinished, onReceivedError...). Так что просто используйте WebViewClient - person younes0; 19.01.2021
comment
если честно, после того, как я спросил, я перепроверил код и понял, почему вы его использовали, но спасибо за объяснение, так как это может помочь кому-то еще - person HiDd3N; 19.01.2021