3

Android AccountManagerでユーザー アカウント (ID、パスワード、トークン) を保存するアプリを実装しようとしています。機能を実装するための参考としてこれを使用しています。

Settings > AccountsAuthenticationActivity を表示し、アカウントを作成できます (アカウントを作成した後に正しく表示されます)。新しいアカウントを追加した後、受け取ったトークンを使用してすぐにユーザーにログインしようとしますsetAuthToken()authTokenただし、これは決して機能せず、常に nullであることがわかります。次に、アプリをもう一度実行し、再度ログインする必要があります。

(サインアップ アクティビティから) 新しいアカウントを追加するコードは、

private void addNewAccount(final AccountManager am, final String accountType, String authTokenType) {
    Log.d(TAG, "addNewAccount(): " + accountType + ", " + authTokenType);
    am.addAccount(accountType, authTokenType, null, null, this, new AccountManagerCallback<Bundle>() {
        @Override
        public void run(AccountManagerFuture<Bundle> future) {
            try {
                Bundle bundle = future.getResult();
                final String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
                Log.d(TAG, "addNewAccount() -> bundle = " + bundle + ", authToken = " + authToken);
                if (!TextUtils.isEmpty(authToken)) {
                    startLoggedInActivity(authToken);
                } else {
                    Log.d(TAG, "token is null"); // <- always get here
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }, null);
}

そして、ログインを終了するコード (トークンを受け取って新しいユーザーを追加した後) は、

private void finishLogin(Intent intent) {
    Log.d(TAG, "finishLogin(): " + intent.getExtras());

    if (intent.hasExtra(KEY_ERROR_MESSAGE)) {
        Toast.makeText(getBaseContext(), intent.getStringExtra(KEY_ERROR_MESSAGE), Toast.LENGTH_SHORT).show();
        setResult(RESULT_CANCELED, intent);
    } else {
        String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
        final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));

        if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
            String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);

            // 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, accountPassword, null);
            Log.d(TAG, "finishLogin() -> addAccountExplicitly: " + account + ", " + accountPassword);
            mAccountManager.setAuthToken(account, mAuthTokenType, authtoken);
            Log.d(TAG, "finishLogin() -> setAuthToken: " + authtoken);
        } else {
            mAccountManager.setPassword(account, accountPassword);
            Log.d(TAG, "finishLogin() -> setPassword: " + account + ", " + accountPassword);
        }

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

問題が何であるかを知っている人はいますか(かなり長い間これに苦労していました:()?

4

0 に答える 0