首页 文章

Android - AccountManager和登录经典

提问于
浏览
0

今天我的应用程序有一个经典的登录界面(用户名和密码),这个类扩展了一个常见的Activity . 我最初的活动是登录(如果已登录用户,则重定向到主页) .

我的android清单:

<!-- Start Activity -->
    <activity
        android:name=".activity.LoginActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

现在我正在尝试部署Android的客户经理,阅读文档并实施 . 功能还可以 . 如果您输入Android帐户设置,则可以登录应用程序并创建帐户 . 但我的问题是如何保持两种方式 .

作为Facebook,如果用户打开应用程序,它将登录并自动在AccountManager上创建一个帐户,并在设置中的帐户中获取它也会记录在应用程序中 . 在服务器上请求用户验证和密码(使用排球)之后,我应该知道要完成哪一步?将数据返回到AccountManager或添加帐户?

登录经典,在服务器验证后使用“addAccountExplicitly”添加帐户:

private void finishLogin(final String email, final String authToken) {
        Account account = new Account(email, AccountGeneral.ACCOUNT_TYPE);
        boolean success = mAccountManager.addAccountExplicitly(account, "", null);
        if (success) {
            Log.d(TAG, "Account created");
            mAccountManager.setAuthToken(account, mAuthTokenType, authToken);
        } else {
            Log.d(TAG, "Account creation failed. Look at previous logs to investigate");
        }
}

并登录帐户设置:

Bundle data = new Bundle();
        data.putString(AccountManager.KEY_ACCOUNT_NAME, email);
        data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
        data.putString(AccountManager.KEY_AUTHTOKEN, authToken);
        data.putString(PARAM_USER_PASS, password);
        final Intent intent = new Intent();
        intent.putExtras(data);

        final Account account = new Account(email, accountType);

        if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
            Log.d(TAG, " finishLogin > addAccountExplicitly");
            // Creating the account on the device and setting the auth token we got
            // (Not setting the auth token will cause another call to the server to authenticate the user)
            mAccountManager.addAccountExplicitly(account, password, null);
            mAccountManager.setAuthToken(account, mAuthTokenType, authToken);
        } else {
            Log.d(TAG, " finishLogin > setPassword");
            mAccountManager.setPassword(account, password);
        }

        setAccountAuthenticatorResult(intent.getExtras());
        setResult(RESULT_OK, intent);
        finish();

1 回答

  • 2

    为了保持两种方式,您不需要有两个活动并处理两个方案 . 只需集成所有登录流程,设置帐户数据并在帐户管理器包中明确添加帐户即可 . (可以到达的那个抛出设置 - >添加帐户) .

    然后在您的应用程序中,您有 AccountManager 类的不同选项 .

    您可以通过拨打getAccountsByType()来检查是否已有帐户 .

    您可以致电AddAccount()在应用中添加帐户 . 它会自动显示您从“设置”中获得的相同活动 . 它还具有返回所选帐户名和authToken的回调 .

    你也可以拨打newChooseAccountIntent() . 这是一个非常好的选择,因为如果没有帐户,此方法会自动显示登录活动,如果已经添加了帐户,则将其显示为列表,用户可以选择帐户 .

相关问题