3

我正在尝试编写自己的身份验证器并将其用作具有两个不同应用程序的库:A 和 B。我关注了这篇文章:http ://udinic.wordpress.com/2013/04/24/write-your-own-安卓身份验证器/ . 我安装了应用 A,然后安装了应用 B。当应用 A 调用 AccountManager.addAccount() 时,AccountAuthenticatorActivity 打开。当应用 B 调用 AccountManager.addAccount() 时,什么也没有发生。如果我卸载应用 A 并在应用 B 中重试,AccountAuthenticatorActivity 将打开。

我的目标是为这两个应用程序使用相同的 AccountAuthenticatorActivity 和 AccountAuthenticator,但它似乎一次只能在一个应用程序上工作。

这是我的 AbstractAccountAuthenticator 中的 addAccount:

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

    final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
    intent.putExtra(AuthenticatorActivity.ARG_ACCOUNT_TYPE, accountType);
    intent.putExtra(AuthenticatorActivity.ARG_AUTH_TYPE, authTokenType);
    intent.putExtra(AuthenticatorActivity.ARG_IS_ADDING_NEW_ACCOUNT, true);
    intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);

    final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);
    return bundle;
}

这就是我从我的两个应用程序中调用 accountManager.addAccount() 的方式:

 private void addNewAccount(String accountType, String authTokenType) {
    final AccountManagerFuture<Bundle> future = mAccountManager.addAccount(accountType, authTokenType, null, null, this, new AccountManagerCallback<Bundle>() {
        @Override
        public void run(AccountManagerFuture<Bundle> future) {
            try {
                Bundle bnd = future.getResult();

            } catch (Exception e) {
                e.printStackTrace();

            }
        }
    }, null);
}
4

1 回答 1

4

我遇到了同样的问题,所有这些混乱的关键是 AndroidManifest.xml

关于如何创建自定义身份验证器的教程有点旧(或至少在 Android Studio 之前),因此它们声明您必须将权限、活动和服务从身份验证器库复制到将使用该库的所有应用程序这是对ANDROID STUDIO来说是错误的,因为 Android Studio 会自动合并来自所有模块的清单。

如果您使用的是 Android Studio,您需要做的就是让身份验证模块中的权限、活动和服务,并简单地在应用程序中添加对该模块的依赖项。

这是一个示例 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    android:allowBackup="true"
    android:label="@string/auth_app_name"
    android:theme="@style/Holo.Theme.Light.DarkActionBar">

    <activity
        android:name="ro.muerte.modules.auth.MyAuthenticatorActivity"
        android:exported="true"
        android:label="@string/auth_action_login"
        android:windowSoftInputMode="adjustResize|stateVisible"
        android:clearTaskOnLaunch="true" />


    <service
        android:name="ro.muerte.modules.auth.MyAuthenticateService"
        android:exported="true">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator" />
        </intent-filter>
        <meta-data
            android:name="android.accounts.AccountAuthenticator"
            android:resource="@xml/authenticator" />
    </service>

</application>

于 2013-11-01T16:24:01.573 回答