与Android的AccountManager自定义帐户类型 [英] Custom Account Type with Android AccountManager
问题描述
我有一个账户类型mypackage.account等内容权威mypackage的。我有一个服务
,提供 AbstractAccountAuthenticator
的实施中, addAccount
方法是这样实现的:
I have an account type "mypackage.account" and a content authority "mypackage". I have a Service
that provides an implementation of AbstractAccountAuthenticator
, the addAccount
method is implemented like this:
/**
* The user has requested to add a new account to the system. We return an intent that will launch our login
* screen if the user has not logged in yet, otherwise our activity will just pass the user's credentials on to
* the account manager.
*/
@Override
public Bundle addAccount(AccountAuthenticatorResponse response, String account_type, String auth_token_type,
String[] required_features, Bundle options) throws NetworkErrorException {
final Intent intent = new Intent(_context, ConnectAccountActivity.class);
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
final Bundle reply = new Bundle();
reply.putParcelable(AccountManager.KEY_INTENT, intent);
return reply;
}
我提供了一个 authenticator.xml
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="mypackage.account"
android:icon="@drawable/ic_launcher"
android:smallIcon="@drawable/ic_launcher"
android:label="@string/app_name"
android:accountPreferences="@xml/account_preferences" />
和我定义这个在
是这样的:的AndroidManifest.xml
服务
and I define this Service
in AndroidManifest.xml
like this:
<!-- Account authentication service that provides the methods for authenticating KeepandShare accounts to the
AccountManager framework -->
<service android:exported="true" android:name=".authenticator.AccountAuthenticatorService" android:process=":auth" tools:ignore="ExportedService">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator"/>
</intent-filter>
<meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator"/>
</service>
这是设置,现在当我想和我的设备上的帐户类型的帐户列表中的画面与动作添加一个新的帐户,我有添加帐户的动作,看起来是这样的:
That's the setup, now when I want to have a screen with the list of my account type accounts on the device with an action to add a new account, I have the add account action that looks like this:
final Intent intent = new Intent(Settings.ACTION_ADD_ACCOUNT);
intent.putExtra(Settings.EXTRA_AUTHORITIES, new String[]{ "mypackage" });
startActivity(intent);
在这一点上,我导致了一个帐户类型选择器,显示mypackage.account和anotherpackage.account作为选项。 (anotherpackage.account在另一个应用程序,我的工作被定义)这似乎并不像预期的行为。我查了一下20倍,通过这两个应用程序定义的机构是不同的 - 他们。可有人告诉我,我缺少的是什么?
At this point I'm led to an account type picker that shows "mypackage.account" and "anotherpackage.account" as options. ("anotherpackage.account" is defined in another app I work on) This doesn't seem to be like the intended behavior. I've checked about 20 times that the authorities defined by both apps are different - and they are. Can someone show me what I'm missing?
推荐答案
Android的解耦出来再咬我。看来,这两个应用程序需要也有一个 sync_adapter.xml
这样的:
Android decoupling came to bite me again. It appears that both apps needed to also have a sync_adapter.xml
like:
<!-- The attributes in this XML file provide configuration information for the SyncAdapter. -->
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="mypackage"
android:accountType="mypackage.account"
android:supportsUploading="true"
android:userVisible="true"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"/>
和它连接到同步服务于的AndroidManifest.xml
:
and connect that to the sync service in the AndroidManifest.xml
:
<!-- Data sync service that provides the SyncAdapter to the SyncManager framework. The SyncAdapter is used to
maintain that the set of data on the device is a subset of the data on the server -->
<service android:exported="true" android:name=".data.sync.SyncService" tools:ignore="ExportedService">
<intent-filter>
<action android:name="android.content.SyncAdapter"/>
</intent-filter>
<meta-data android:name="android.content.SyncAdapter" android:resource="@xml/sync_adapter"/>
</service>
有关完整,我的服务
实现如下:
For completeness, my Service
is implemented as follows:
/**
* Service that provides sync functionality to the SyncManager through the {@link SyncAdapter}.
*/
public class SyncService extends Service {
@Override
public void onCreate() {
synchronized (_sync_adapter_lock) {
if (_sync_adapter == null)
_sync_adapter = new SyncAdapter(getApplicationContext(), false);
}
}
@Override
public IBinder onBind(Intent intent) {
return _sync_adapter.getSyncAdapterBinder();
}
private static final Object _sync_adapter_lock = new Object();
private static SyncAdapter _sync_adapter = null;
}
和 SyncAdapter
:
/**
* Sync adapter for KeepandShare data.
*/
public class SyncAdapter extends AbstractThreadedSyncAdapter {
public SyncAdapter(Context context, boolean should_auto_initialize) {
super(context, should_auto_initialize);
//noinspection ConstantConditions,PointlessBooleanExpression
if (!BuildConfig.DEBUG) {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
Log.e("Uncaught sync exception, suppressing UI in release build.", throwable);
}
});
}
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider,
SyncResult sync_result) {
// TODO: implement sync
}
}
虽然我实际上没有任何同步数据(应用程序,甚至没有与任何服务器现在),Android框架似乎是使用 SyncAdapter $ C $的设置C>找出哪个帐户添加帐户要求身份验证响应。
Even though I'm not actually syncing any data (the apps are not even linked to any server right now), the Android framework appears to be using the settings of the SyncAdapter
to figure out which account authenticator respond to the add account request.
这篇关于与Android的AccountManager自定义帐户类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!