Pergunta

Estou trabalhando em um aplicativo Android que usa o Gerente de contas para armazenar contas e credenciais.Um problema que tenho tido é que, embora eu passe vários valores de String para o AccountManager addAccountExplicitamente pacote de dados.

Eu verifiquei para ter certeza de que o pacote está não está vazio e que isso contém os valores antes de adicionar a conta.E na maioria das vezes é esse o caso, mas de vez em quando recebo null quando consulto esses valores.

Os valores de retorno nulos são mais comuns depois de excluir a conta e adicioná-la novamente.

Estou fazendo minha consulta dentro do onAccountsAtualizado método de um OnAccountsUpdateListener implementação, então a conta deve ser adicionada e pronta para uso, certo?

Obrigado por qualquer ajuda

AutenticadorAtividade

// in the AuthenticatorActivity
Bundle userData = new Bundle();
userData.put (k1, v1);
userData.put (k2, v2);
userData.put (k3, v3);
userData.put (k4, v4);
userData.put (k1, v1);

Account a = new Account ("acc name", "com.account.type");
AccountManager am = AccountManager.get(this);

OnAccountsUpdateListener listener = new OnAccountsUpdateListener() {

        @Override
        public void onAccountsUpdated(Account[] accounts) {
            Account mine = findAccount(accounts, account); // match account name
            notifySignedIn(mine); // tell the world you're signed in
            am.removeOnAccountsUpdatedListener(this);
        }
    };

am.addOnAccountsUpdatedListener(listener, handler, false);
am.addAccountExplicitly(a, "themostsecurepwintheworld", userData);

Algum outro tópico

AccountManager am = AccountManager.get(mContext);
final string value2 = am.getUserData(mAccount, k2);

if (TextUtils.isEmpty(value2)) {
    Log.d("WTF", "value is empty");
}
Foi útil?

Solução

Estou ciente de um bug no Honeycomb plus que pode causar o seu problema.Se você tentar getUserData da conta antes de ela ser registrada, todas as chamadas getUserData subsequentes retornarão nulo.

Se você olhar o código.O AccountManager possui um cache na memória apoiado por um banco de dados sqlite.Chamar getUserData preenche os dados do usuário do cache na memória, mesmo que não esteja registrado.Se não estiver registrado, ele interpreta isso como nenhum dado do usuário.O registro de uma conta apenas preenche o banco de dados e não invalida o armazenamento na memória.

Isso pode estar causando o seu problema.

A solução alternativa é remover a conta antes de chamar addAccountExplicitly.

Sim, esse problema é uma droga e é um bug ENORME no AccountManger IMO e permite que terceiros dêem essência ao DOS em seu aplicativo.

Outras dicas

Você está usando um dispositivo HTC com Android 4?Recebi muitos relatos sobre esse problema de usuários dos meus aplicativos de sincronização. Todos deles usaram um dispositivo HTC com SDK nível 15.

Parece um bug do HTC para mim.

Vários usuários relataram que o problema desapareceu após a reinicialização.

Atualizar: Enquanto isso, encontramos uma solução adequada, veja https://stackoverflow.com/a/29776224/1558654

Eu tive um problema semelhante, mas meu problema acabou sendo tentar armazenar um valor userData longo em vez de uma String.Converter meu long em uma string para armazenamento e analisá-lo em um long novamente ao retirá-lo funcionou para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top