Facebook Android API 和 Twitter Webview 登录集成

Posted

技术标签:

【中文标题】Facebook Android API 和 Twitter Webview 登录集成【英文标题】:Facebook Android API and Twitter Webview Login integration 【发布时间】:2013-09-18 15:23:09 【问题描述】:

我有一个 android 应用程序,需要用户使用 facebook 或 twitter 登录。我设法实现了这两种方法并取得了部分成功。 facebook 登录是使用 facebook 的 this 教程实现的。

至于 twitter 登录,我只是使用了一个按钮来启动执行 webview 登录的 TwitterLoginActivity,如果成功则启动 TwitterHomeActivity,它在碎片方面的实现与 facebook 登录非常相似。

这里是整个登录实现的细分

FacebookHomeActivity 有 3 个片段

FacebookSplashFragment(使用 fb 或 twitter 登录的选项) FacebookSelectionFragment(显示应用菜单) FacebookUserSettingsFragmen(注销用户)。

TwitterHomeActivity 有 2 个片段

TwitterSelectionFragment(显示应用菜单) TwitterUserSettingsFragment(注销用户)

TwitterLoginActivity(包含通过我的服务器执行身份验证的 webview,它将重定向到 twitter 页面进行登录)

如果您还没有看到,问题是,如果我从 twitter 帐户注销,我必须启动 FacebookHomeActivity 才能看到登录 facebook 或 twitter 的选项。

这样做是非常hacky而且很糟糕。所以我想如果我把它全部做成碎片,它可能会解决我的问题。

LoginActivity(所有事物登录的主机)包含:

LoginSelectionFragment(选择用 facebook 或 twitter 登录) TwitterLoginFragment(通过 webview 登录用户) FacebookSelectionFragment(授权用户并显示菜单) TwitterSelectionFragment(显示菜单) FacebookUserSettingFragment(注销 Facebook 用户) TwitterUserSettingFragment(退出 Twitter 用户)

通过使用它来显示不同登录状态下的正确片段:

        @Override
protected void onResumeFragments() 
    super.onResumeFragments();

    Session session = Session.getActiveSession();

    if (session != null && session.isOpened()) 
        // if the session is already open,
        // try to show the selection fragment
        getSupportActionBar().show();
        showFragment(FACEBOOKSELECTION, false);
    

    else if (Globals.loggedIn() && Globals.isTwitterUser()) 
        // otherwise present the splash screen
        // and ask the person to login.
        getSupportActionBar().show();
        showFragment(TWITTERSELECTION, false);

     
    else 
        // otherwise present the splash screen
        // and ask the person to login.
        Globals.logout();
        getSupportActionBar().hide();
        showFragment(LOGINSELECTION, false);
    


让所有登录逻辑都以片段的形式存在对我来说似乎很有意义,但它的行为方式并不像我想象的那样工作。相反,它基本上运行每个片段中 onStart() 中的所有内容,所以想象一下弹出很多progressDiaglogs,除此之外什么都没有发生。 backstack 也被弄乱了,导致一个片段从未显示出来。要么我执行这个错误,要么这是解决这个问题的完全错误的方法。

我的问题是:如果这不是解决问题的好方法,那么实现 Facebook 登录和 Twitter 登录的更好方法是什么。

如果上述内容确实有意义并且没有任何问题,那么您认为我做错了什么?

【问题讨论】:

【参考方案1】:

在尝试新方法大约 5 天后,例如使用自己的片段集将 Facebook 登录身份验证与自己的 Activity 隔离,这些片段也未能按应有的方式运行,我阅读了Fragments Documentation,它给了我一个更好地理解片段如何实际工作以及如何工作。对于与我遇到类似问题的任何人,我强烈建议您先阅读文档。

我使用的 FragmentManager 或者更确切地说 SupportFragmentManager 与方法 beginTransaction() 一起公开了名为 replace() 的方法,它允许您将当前视图中的片段替换为要显示的片段。以下是我的使用方法:

  public void replaceFragment(Fragment f, Boolean addToBackStack) 
        if (addToBackStack) 
            getSupportFragmentManager().beginTransaction()
                    .replace(android.R.id.content, f).addToBackStack(null).commit();
         else 
            getSupportFragmentManager().beginTransaction()
                    .replace(android.R.id.content, f).commit();
        
    

addToBackStack 参数是由你决定用户是否可以 显示新片段后导航回该片段。

因此,我没有使用 Facebook Android API 示例中显示的 showFragment(),而是将所有 showFragment() 方法替换为 replaceFragment()。

两者之间的区别在于,当您使用 showFragment() 方法预加载主机活动中的所有片段(在我的情况下为 LoginActivity.java)时,会发生所有片段的 onCreate(), onStart() 和 onResume() 函数被调用。这种行为很糟糕,因为我的一些片段开始执行 onStart() 方法中的代码,导致所有 progressDialogs 在不应该显示时也显示出来。

通过使用上面显示的replaceFragment()方法,我可以只在需要显示它时实例化片段,让我可以正常使用生命周期方法(onCreate()、onStart()、onResume()等)。

用户登录成功后,我简单地向用户展示我的菜单,并通过以下方法清除后台堆栈:

public void clearBackStack() 
    FragmentManager manager = getSupportFragmentManager();
    // Get the number of entries in the back stack
    int backStackSize = manager.getBackStackEntryCount();
    // Clear the back stack
    for (int i = 0; i < backStackSize; i++) 
        manager.popBackStack();
    

清除后台堆栈的关键区域将在用户完成后 成功登录,以及当用户成功退出时。

有了这个,我能够更好地控制片段,因为它们在生命周期方面表现得像活动。

希望这对那里的人有所帮助。

【讨论】:

以上是关于Facebook Android API 和 Twitter Webview 登录集成的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 在 web laravel 和 android 移动应用程序上登录

android 在 facebook 聊天中使用 smack api

Android:使用 facebook API 登录

Android - 基于 facebook 的 Firebase 登录并调用 Facebook Graph Api 问题

Android Facebook Graph API

一起走进GraphQL