无法让我的AccountAuthenticatorActivity在两个不同的应用程序中打开

时间:2013-10-21 10:49:46

标签: android authentication accountmanager

我正在尝试编写自己的Authenticator并将其用作具有两个不同应用程序的库:A和B. 我关注过这篇文章:http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/。 我安装了应用程序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);
}

1 个答案:

答案 0 :(得分: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>