没有帐户的SyncAdapter

我正在尝试为我的Android应用创build一个SyncAdapter来显示来自特定频道的YouTubevideo。 video是公共领域,所以我不希望用户login,创build一个帐户,authentication自己,上传数据,或使用联系人数据库。 我只是希望SyncAdapter定期用来自该频道的最新video元数据更新我的应用程序的数据库。 我已经build立了一个ContentProvider来访问我的数据库。 我确实喜欢SyncProvider会处理closures同步,调度和重试退避机制以进行更新的function。

我之前问过SyncAdapter是不是我的用例的好select,我被告知是。 我观看了Google I / Ovideo,阅读了文档,阅读了博客…(见下面的列表)。 我一直无法得到任何工作。 最好的办法是让SyncAdapter帐户在全球“帐户和同步设置”中显示,但不起作用。 即使这个工作,这将是不够理想的,因为我喜欢用户看不到除了我的应用程序内的帐户。 这是可以接受的,如果没有其他的select,只要他们不需要访问它来设置它,因为每天都会默认自动一次同步。

我甚至试图按原样使用SampleSyncAdapter,并在authentication代码部分放置断点。 没有一个断点,所以我不能看到什么触发的调用或包含哪些数据。 我原以为我至less会得到那么多。

尽pipe有build议,但我开始认为使用SyncAdapter是一个糟糕的主意。 我还没有find一个接近我想要的例子,更不用说教程或完整的,有组织的和清晰的文档。 这似乎应该是许多应用程序想要做的常见任务。

请在这篇文章中添加关于这个用例的好文档。 我找不到
如果没有这个,我认为推荐大家不要在这个用例中使用SyncAdapter是公平的。 我不是在这里讲其他用例,所以如果它不像我的那样,不要继续为你的用例工作。

了解什么版本的API级别已经准备好用于黄金时段也是有帮助的。 关于版本号发布了一些问题。 我试图保持尽可能低的最大用户。 我目前的API目标是7。

以下列出的链接我试图无效,其他人可能会发现这些链接更有帮助:

http://developer.android.com/resources/samples/SampleSyncAdapter/index.html

http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

http://naked-code.blogspot.com/2011/05/revenge-of-syncadapter-synchronizing.html

Writing an Android Sync Provider: Part 1

Writing an Android Sync Provider: Part 2

http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step

http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step-1

http://www.finalconcept.com.au/article/view/android-account-manager-step-by-step-2

没有authentication的Android SyncAdapter与Android服务

为什么ContentResolver.requestSync不会触发同步?

Solutions Collecting From Web of "没有帐户的SyncAdapter"

总之答案是: ContentProviderAccountManagerSyncAdapter一起去。 即使他们是“哑巴”,你也必须有这三件。

如上所述,“ContentProvider,AccountManager和SyncAdapter一起”。 对于您的应用程序,您可以在第一次加载应用程序进行身份validation并自动开始同步时调用以下活动:

 public class LoginActivity extends AccountAuthenticatorActivity { private final static String DUMMY_ACCOUNT_NAME = "some_name"; private final static String DUMMY_ACCOUNT_PASS = "some_pass"; private final static String AUTHORITY = "com.android.contacts"; // for example /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Account account = new Account(DUMMY_ACCOUNT_NAME, Constants.ACCOUNT_TYPE); AccountManager am = AccountManager.get(this); if (am.addAccountExplicitly(account, DUMMY_ACCOUNT_PASS, null)) { Bundle result = new Bundle(); result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name); result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type); setAccountAuthenticatorResult(result); ContentResolver.setSyncAutomatically(account, AUTHORITY, true); } finish(); } } 

这适用于Android API 5+。