我正在尝试编写自己的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);
}
答案 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>