Google的Android文档(http://developer.android.com/reference/android/accounts/AccountManager.html#addAccountExplicitly(android.accounts.Account,java.lang.String,android.os.Bundle))说:
返回
如果帐户已成功添加,则为True;如果帐户已存在,则为false,帐户为空,或发生其他错误
我变得虚假.具体来说,还有哪些其他错
android android-syncadapter android-authenticator android-account
我们目前在做什么?
我们在使用Web服务(RESTful)公开的服务器上有一些结构化的文本数据.我的应用程序定期轮询此服务器(AlarmManagerService)以获取数据并将其保存在本地数据库(sqlite)上.此外,用户事先经过身份验证和授权以进行访问.
问题:
SDK中有一个SyncAdapter/AccountManager类,我想知道它是否可以在我的应用程序中用于实现上述同步?
如果是,后端需要什么样的基础设施才能支持使用此适配器进行同步设置?链接到文章等,提供使用此适配器和其他信息的详细信息表示赞赏.
我正在创建一个新的Android应用程序,SyncAdapter用于处理数据库同步.我有一切就绪,应用程序工作正常,但我注意到我登录了两次.
当AuthenticatorActivity类(它扩展AccountAuthenticatorActivity)验证用户和密码时,首次登录.
如果用户和密码正确,AuthenticatorActivity那么:
account不存在则使用它创建它mAccountManager.addAccountExplicitly()authToken使用保存intent.putExtra(AccountManager.KEY_AUTHTOKEN, authToken);这基本上是从Android样本中复制/粘贴的,所以我猜它没关系.
问题在于SyncAdapter启动和使用时
authtoken = mAccountManager.blockingGetAuthToken(account,
AuthenticatorActivity.PARAM_AUTHTOKEN_TYPE, true);
Run Code Online (Sandbox Code Playgroud)
调用扩展类中的getAuthToken()方法.在这个方法中,我再次访问登录端点.AuthenticatorAbstractAccountAuthenticator
从那时起,登录端点在authToken到期之前不会再次被击中.
这不是困扰我的东西,但我想知道是否有办法避免两次登录.
我有一个SyncAdapter用于我的应用程序,以及AccountManager将我的应用程序帐户添加到Android帐户管理器.我向帐户管理器添加帐户的代码如下所示:
Bundle data = new Bundle(5);
data.putString(_PEOPLE_ID, people_id);
data.putString(_FIRST_NAME, first_name);
data.putString(_LAST_NAME, last_name);
data.putString(_PLAN, plan);
data.putString(_BIRTHDAY, birthday);
Account account = new Account(username, _ACCOUNT_TYPE);
try {
boolean created;
created = _account_manager.addAccountExplicitly(account,
_cryptography.encrypt(_SEED, password), data);
response.accountCreated(created);
_account_manager.setAuthToken(account, _TOKEN_TYPE, session_token);
_model.updateActiveAccount(people_id, username, password);
SharedPreferences.Editor settings = _settings.edit();
settings.putString(_ACCOUNT_TYPE, account.name);
settings.putString(_TOKEN_TYPE, session_token);
settings.commit();
// Tells the content provider that it can sync this account
ContentResolver.setIsSyncable(account, AUTHORITY, 1);
final Bundle extras = new Bundle(1);
extras.putBoolean(SYNC_EXTRAS_INITIALIZE, true);
ContentResolver.addPeriodicSync(account, AUTHORITY, extras, 900);
} catch …Run Code Online (Sandbox Code Playgroud) 我认为众所周知,在最糟糕的主题列表中,SyncAdapter像钻石一样闪亮!根据http://udinic.wordpress.com/2013/07/24/write-your-own-android-sync-adapter/ SyncAdapter带来4个主要好处: A)电池效率 B)接口C)内容意识D)重试机制;
如果在任何情况下都需要将sqlite数据库与远程SQL数据库同步,并且不需要这些优势,那么还有什么其他选择**?它可以很容易地管理带有php的数据库之间的服务,我为上传部分同步过程做了这个,但对于下载部分我觉得如果我使用查询填充方法很傻,因为在不久的将来远程数据库可能变得越来越大.我想到的唯一解决方案就是自己编写同步活动/服务,但我不知道如何访问SQLite数据库/表的最后更新日期(除了在每个表中指定_date),以检查是否有必要再次同步?我觉得我的头在两个地方之间!
我正在编写自己的ContentProvider,它将使用SyncAdapter同步到Web服务.
当同步适配器正在修改内容提供程序的数据时,问题发生在内部调用getContentResolver().notifyChange导致同步循环时,提供程序触发网络同步.
客户端应用程序执行修改时需要带有网络同步标志的notifyChange,但在同步适配器修改时应避免使用.
如何在内容提供者内部轻松判断客户端应用程序(应该在修改时触发网络同步)或同步适配器(不应触发网络同步)使用它.
目前我正在使用不同的CONTENT_URI(同步适配器使用CONTENT_URI_NO_SYNC访问数据,使用CONTENT_URI访问客户端应用程序)以便能够区分这两种类型的访问并相应地设置网络同步标志.
我正在为Android应用程序实现一个syncadapter,并希望在"帐户和同步"菜单下对该帐户进行设置.我已经在DropBox应用程序中看到了这一点(如下所示),但我无法找到有关如何执行此操作的文档.我添加了帐户,只想在此菜单中添加指向帐户设置的链接.

我想在我的应用程序中使用同步适配器来同步本机和第三方联系人(FB除外)与服务器.(只有客户端到服务器单向同步)
我有两个疑问 -
1)如果设备中有多个同步适配器,并且如果另一个同步适配器已清除脏位,我的同步适配器是否能够立即检测到联系人更改/更新.
2)我用过
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 1);
ContentResolver.setSyncAutomatically(account, ContactsContract.AUTHORITY, true);
Run Code Online (Sandbox Code Playgroud)
将联系人与服务器同步.
它确实每隔30秒开始同步.
但是我想让它在添加或删除或更新联系人时立即得到通知以启动perfromSync操作.
我是否也需要使用观察者?
我在同步成功后在SyncAdapter中更改并提交SharedPreference,但是当我在Activity中访问首选项时,我没有看到更新的值(相反,我看到的是旧值).我究竟做错了什么?不同的上下文?
我在SyncAdapter中更新首选项:
class SyncAdapter extends AbstractThreadedSyncAdapter {
private int PARTICIPANT_ID;
private final Context mContext;
private final ContentResolver mContentResolver;
public SyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
mContext = context;
mContentResolver = context.getContentResolver();
}
public SyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
super(context, autoInitialize, allowParallelSyncs);
mContext = context;
mContentResolver = context.getContentResolver();
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
PARTICIPANT_ID = Integer.parseInt(prefs.getString("participant_id", "0"));
if (success) {
// save and …Run Code Online (Sandbox Code Playgroud)