Android WebView не возвращается после входа в Facebook? - PullRequest
0 голосов
/ 24 января 2019

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

У меня есть сайт, который использует Facebook Js SDK Версия 3.2

Отлично работает на : Google Chrome в моем ноутбуке.

Отлично работает на : Google Chrome в моем телефоне

но в приложении в webView после того, как я вставил имя пользователя и пароль Facebook и нажал кнопку входа, он завис. Я думаю, что это не может вернуться на предыдущую страницу ..

Я прочитал много постов здесь, но ничего не работает ..

это мой MainActivity:

import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.CookieManager;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;

import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static final String target_url = "https://myapp.com/gen_age/index.php";
    private static final String target_url_prefix = "myapp.com/gen_age/index.php";
    private WebView mWebview;
    private WebView mWebviewPop;
    private FrameLayout mContainer;
    private SwipeRefreshLayout swipeLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);

        mWebview = findViewById(R.id.webView);
        mContainer = findViewById(R.id.webview_frame);
        swipeLayout = findViewById(R.id.swipe_container);

        final WebSettings webSettings = mWebview.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setSupportMultipleWindows(true);
        mWebview.setWebViewClient(new UriWebViewClient());
        mWebview.setWebChromeClient(new UriChromeClient());
        mWebview.loadUrl(target_url);


        swipeLayout.setRefreshing(true);

        swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

            @Override
            public void onRefresh() {
                //Do your task
                mWebview.reload();
            }
        });

    }

    private class UriWebViewClient extends WebViewClient {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            swipeLayout.setRefreshing(false);
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            swipeLayout.setRefreshing(false);
        }

        @Override
        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);
            swipeLayout.setRefreshing(false);
        }

        @Override
        public boolean shouldOverrideUrlLoading(final WebView view, final String url) {

            try {

                String host = Uri.parse(url).getHost();
                //Log.d("shouldOverrideUrlLoading", url);
                if (host.equals(target_url_prefix)) {
                    // This is my web site, so do not override; let my WebView load
                    // the page
                    if (mWebviewPop != null) {
                        mWebviewPop.setVisibility(View.GONE);
                        mContainer.removeView(mWebviewPop);
                        mWebviewPop = null;
                    }
                    return false;
                }

                if (host.equals("m.facebook.com")) {
                    return false;
                }




            } catch (Exception e) {
                Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
            }

//            swipeLayout.setRefreshing(false);

            return true;
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            swipeLayout.setRefreshing(false);

            Log.d("onReceivedSslError", "onReceivedSslError");
            //super.onReceivedSslError(view, handler, error);
        }
    }



    @Override
    public void onBackPressed() {
        if (mWebview.canGoBack()) {
            mWebview.goBack();
        } else {
            finish();
        }
    }

    class UriChromeClient extends WebChromeClient {

        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog,
                                      boolean isUserGesture, Message resultMsg) {
            mWebviewPop = new WebView(getApplicationContext());
            mWebviewPop.setVerticalScrollBarEnabled(false);
            mWebviewPop.setHorizontalScrollBarEnabled(false);
            mWebviewPop.setWebViewClient(new UriWebViewClient());
            mWebviewPop.getSettings().setJavaScriptEnabled(true);
            mWebviewPop.getSettings().setSavePassword(false);
            mWebviewPop.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT));
            mContainer.addView(mWebviewPop);
            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
            transport.setWebView(mWebviewPop);
            resultMsg.sendToTarget();

            return true;
        }

        @Override
        public void onCloseWindow(WebView window) {
            Log.d("onCloseWindow", "called");
        }

    }
}

1 Ответ

0 голосов
/ 24 января 2019

Я собираюсь выйти из этого вопроса и сказать, что вы выполняете операции ввода-вывода (например, пытаетесь войти в систему, отправляя учетные данные через Интернет) в главном потоке пользовательского интерфейса .Если это так, то это то, что заставляет ваше приложение зависать.

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

Основной поток в Android отвечает за обновление пользовательского интерфейса, и если вы заблокируете его с помощью блокирует операцию ввода-вывода , он будет зависать.

...