2

我是 android.accounts api 的新手,现在我正在尝试对它们做一些事情,但出现了一个看似虚拟的问题......
我为我的应用程序创建了一个 Authenticator,但尚未实现抽象方法。它的图标成功出现在系统的Add a Account窗口中,我知道当我点击它时,会调用Authenticator中的addAccount方法。

现在我希望在这个方法中做一些简单的事情,并在下面编写代码:

    @Override
public Bundle addAccount(AccountAuthenticatorResponse response,
        String accountType, String authTokenType, String[] requiredFeatures,
        Bundle options) {

    Log.d(LOG_TAG, "RRAuthenticator add account... ");
    String accountName = "example@example.com";
    Account account = new Account(accountName, accountType);
    String password = "example_password";
    AccountManager manager = AccountManager.get(context);
    manager.addAccountExplicitly(account, password, null);

    Bundle bundle = new Bundle();
    bundle.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
    bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
    bundle.putString(AccountManager.KEY_AUTHTOKEN, "example_authtoken");
    return bundle;
}

我看过 SampleSyncAdapter 的演示,并做出类似的动作。但我通过直接添加帐户来练习使用这些 API。但是系统被线路崩溃了是manager.addAccountExplicitly(account, password, null); 怎么回事呢?


稍后添加:系统进程中的异常。系统会崩溃。AccountManager 抛出 NullPointerException。似乎 addAccountExplicitly 方法的问题,当我评论此语句时,不会发生崩溃。

4

2 回答 2

1

我已经解决了。

事实证明,这是 Android 2.0 中的一个错误。
如果您将帐户添加到 AccountManager,您还必须在 Android 2.0 平台下为该帐户提供 SynAdapter。但在 Android 2.1 及更高版本下一切正常。

这是一个已知问题,请参考:
http
://code.google.com/p/android/issues/detail?id=5009 和
没有 SyncAdapter 的 AccountManager?

于 2011-05-21T09:18:58.450 回答
0
 Account account = new Account(username, AuthConstants.ACCOUNT_TYPE);
            if (am.addAccountExplicitly(account, password, null)) {
                result = new Bundle();
                ContentResolver.setSyncAutomatically(account, DB.AUTHORITY, true);
                result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
                result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
                return result;
            } 

我在我的一个应用程序中使用此代码,它运行良好。这里的关键是 AccountAuthenticatorActivity 应该设置应该注册的身份验证结果包(android开发人员的同步适配器有这个。

这也是我的 accountAuthentication 服务的 addAccount 方法

    @Override
public Bundle addAccount(AccountAuthenticatorResponse response,
    String accountType, String authTokenType, String[] requiredFeatures,
    Bundle options) {
    final Intent intent = new Intent(mContext, LoginScreen.class);
    intent.putExtra(LoginScreen.PARAM_AUTHTOKEN_TYPE,
        authTokenType);
    intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
        response);
    final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);
    return bundle;
}

更新

身份验证器

这是我使用的链接。这是一个很好的项目。我相信它来自 last.fm android 应用程序。我相信它还在 git 上打开了源代码。所以尝试与之比较。

权限

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
  <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
  <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
  <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
  <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
  <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
于 2011-05-19T12:30:53.480 回答