Android AccountManager не передает преднамеренные дополнения - PullRequest
0 голосов
/ 28 января 2019

Я использую менеджер аккаунтов Android для обработки аутентификации в моем приложении. Документация говорит:

Если для вашей активности аутентификатора требуются какие-либо специальные параметры инициализации, вы можете присоединить их к намерению с помощью Intent.putExtra ().

Но в моей деятельности дополнительные значения всегда равны нулю.

Это мой класс Authenticator:

Метод addAccount:

override fun addAccount(
    response: AccountAuthenticatorResponse?,
    accountType: String?,
    authTokenType: String?,
    requiredFeatures: Array<out String>?,
    options: Bundle?
): Bundle {
    val result = Bundle()
    val account = AuthenticationHelper.findAccount()
    account?.let {
        result.addErrorMessage(
            context.resources?.getString(R.string.account_number_exceeded),
            AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION
        )
        handler.post { Toast.makeText(context, R.string.account_number_exceeded, Toast.LENGTH_LONG).show() }
        return result
    }

    val intent = createAuthenticatorActivity(response, true)
    result.putParcelable(AccountManager.KEY_INTENT, intent)
    return result
}

getAuthTokenМетод:

override fun getAuthToken(
    response: AccountAuthenticatorResponse?,
    account: Account?,
    authTokenType: String?,
    options: Bundle?
): Bundle {
    val result = Bundle()

    if (!checkSignature(options)) {
        result.addErrorMessage("Cannot access auth token from other apps.", AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION)
        return result
    }

    // handle when auth token type is not valid.
    if (authTokenType !in arrayOf(
            AuthenticationConstants.AUTHTOKEN_TYPE_FULL_ACCESS,
            AuthenticationConstants.AUTHTOKEN_TYPE_READ_ONLY
        )
    ) {
        handler.post { Toast.makeText(context, R.string.auth_type_not_supported, Toast.LENGTH_LONG).show() }
        result.addErrorMessage("Invalid auth token type.", AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION)
        return result
    }

    val authToken = accountManager.peekAuthToken(account, authTokenType)

    // if auth token is not empty we return it.
    if (!authToken.isNullOrEmpty()) {
        result.putString(AccountManager.KEY_ACCOUNT_NAME, account?.name)
        result.putString(AccountManager.KEY_ACCOUNT_TYPE, account?.type)
        result.putString(AccountManager.KEY_AUTHTOKEN, authToken)
        return result
    }

    // if auth token is empty we try to refresh it.
    if (authToken.isNullOrEmpty()) {
        val refreshToken = accountManager.getPassword(account)
        val username = account?.name ?: ""

        // if refresh token is not empty we try to refresh it.
        if (!refreshToken.isNullOrBlank()) {
            try {
                val authData = runBlocking {
                    val renewTokenRequest = RenewTokenRequest(username, refreshToken)
                    renewToken(RenewToken.Params(renewTokenRequest))
                }
                if (!authData.accessToken.isNullOrBlank() && !authData.refreshToken.isNullOrBlank()) {
                    result.putString(AccountManager.KEY_ACCOUNT_NAME, account?.name)
                    result.putString(AccountManager.KEY_ACCOUNT_TYPE, account?.type)
                    result.putString(AccountManager.KEY_AUTHTOKEN, authData.accessToken)
                    accountManager.setPassword(account, authData.refreshToken)
                    return result
                }
            } catch (e: Throwable) {
                Log.e("Authentication Error", "Cannot refresh access token.")
                e.printStackTrace()
            }
        }

    }

    // we re-authenticate if refresh token is empty.
    val intent = createAuthenticatorActivity(response, false, account?.name)
    result.putParcelable(AccountManager.KEY_INTENT, intent)
    return result
}

вспомогательный метод для создания намерения:

private fun createAuthenticatorActivity(
    response: AccountAuthenticatorResponse?,
    isAddingNewAccount: Boolean,
    accountName: String? = null
): Intent {
    val intent = AuthenticatorActivity.callingIntent(context)
    intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response)
    if (isAddingNewAccount) {
        intent.putExtra(AuthenticatorActivity.ARG_IS_ADDING_NEW_ACCOUNT, true)
    } else {
        intent.putExtra(KEY_ACCOUNT_NAME, accountName)
    }
    return intent
}

Использование intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME) Я не могу получить имя учетной записи в своей деятельности.В методе getAuthToken я добавляю имя учетной записи в предварительно заполненное поле имени пользователя на экране входа в систему.

Примечание. Моя аутентификация не распространяется на класс AccountAuthenticatorActivity, потому что я не использую его для установки результата, но я пытался это сделатьтоже, и это не помогло.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...