java - 如何从 Android WebView 进行 google 登录并在成功登录后重定向回主网站?

标签 java android android-webview google-signin

我有一个 Android 应用程序,它使用 webview 来呈现一个具有 google 登录和 facebook 登录的网站。问题是,当我登录 google 或 facebook 时,它会打开一个移动浏览器,成功登录后它不会返回到应用程序,而是保留在浏览器中。我希望它转到应用程序。登录页面在 Web View 本身中打开还是在浏览器中打开并不重要。但成功登录后,它应该重定向回应用程序中的主页网站。我尝试在 webview 本身中渲染登录页面,但登录后它卡在页面中。

我已在 list 中添加了 INTERNET 权限

public class MainActivity extends AppCompatActivity {

    WebView myWebView;
    WebView myPopedWebView;
    WebSettings myWebSettings;
    FrameLayout mContainer;
    String HOME_URL = "https://www.something.com";
    String HOME_URL_PREFIX = "www.something.com";
    Context mContext;

    @SuppressLint("SetJavaScriptEnabled")
    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        myWebView = findViewById(R.id.myWebView);
        myWebSettings = myWebView.getSettings();
        mContainer = findViewById(R.id.frame_layout);

        myWebView.loadUrl(HOME_URL);
        myWebView.setWebViewClient(new customWebViewClient());
        myWebView.setWebChromeClient(new customWebChromeClient());

        myWebSettings.setJavaScriptEnabled(true);
        myWebSettings.setDomStorageEnabled(true);
        myWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        myWebSettings.setAppCacheEnabled(true);
        myWebSettings.setSupportMultipleWindows(false);
        myWebSettings.setUserAgentString(myWebSettings.getUserAgentString().replace("; wv", ""));

        mContext = this.getApplicationContext();
    }

    public class customWebViewClient extends WebViewClient {

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

            String host = Uri.parse(url).getHost();
            Log.d("Loading url", url);

            if (host.equals(HOME_URL_PREFIX)) {

                if (myPopedWebView != null) {
                    myPopedWebView.setVisibility(View.GONE);
                    mContainer.removeView(myPopedWebView);
                    myPopedWebView = null;
                }
                return false;
            }
            if (host.equals("www.facebook.com") || host.equals("www.accounts.google.com")) {
                return false;
            }

            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return false;
        }

        @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            Log.d("onReceivedSslError", "onReceivedSslError");
        }
    }

    public class customWebChromeClient extends WebChromeClient {

        @SuppressLint("SetJavaScriptEnabled")
        @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {

            myPopedWebView = new WebView(mContext);

            myPopedWebView.getSettings().setDomStorageEnabled(true);
            myPopedWebView.getSettings().setJavaScriptEnabled(true);

            myPopedWebView.setWebChromeClient(new customWebChromeClient());
            myPopedWebView.setWebViewClient(new customWebViewClient());
            myPopedWebView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

            WebView.WebViewTransport transport = (WebView.WebViewTransport)resultMsg.obj;
            transport.setWebView(myPopedWebView);
            resultMsg.sendToTarget();

            return true;
        }

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

最佳答案

您没有任何通过登录回调请求 facebook(或 google)帐户登录的代码。您可以执行以下操作:

  1. 在使用 facebook 或 google 按钮登录的网站中对登录功能(以及登录回调 URL 配置)进行编码。

  2. 或者,您可以在 Android 应用中添加 facebook 和 google 登录(auth)sdks,并在应用中处理登录和回调(编写 java/kotlin 代码)。

您可以选择两种方法中的任何一种,您可以轻松地在网上找到有关如何在Web(方法1)或Android(方法2)中集成facebook sdk的教程。

祝你编码愉快!!

关于java - 如何从 Android WebView 进行 google 登录并在成功登录后重定向回主网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57220054/

相关文章:

java - swig从struct中的变量获取返回类型作为java中的字符串数组

java - 正则表达式将字符串拆分为 5 个部分,如下所示

java - Android:上下文是否影响filterEquals(),用于取消报警?

android - 将 HTML 文件加载到 WebView

java - 对 moviedb 的 JSON 请求解析错误

java - HttpUrlConnection Post 导致浏览器下载 Java 代理中的响应 JSON

java - 从 Realm 检索聊天消息的有效方法是什么?

android - 在重新启动 Eclipse 之前,不会应用对 Android 库项目的更改

android - WebView getScrollY() 总是返回 0

Android WebView 不显示 Google-plus 幻灯片菜单