8

我正在尝试为我的 Android 应用创建一个 SyncAdapter,以显示来自一个特定频道的 YouTube 视频。这些视频是公共领域的,所以我不希望用户登录、创建帐户、验证自己、上传数据或使用联系人数据库。我只是希望 SyncAdapter 定期使用来自该频道的最新视频元数据更新我的应用程序的数据库。我已经构建了一个 ContentProvider 来访问我的数据库。我确实喜欢 SyncProvider 将处理关闭同步、调度和重试更新退避机制的能力这一事实。

我之前问过 SyncAdapter 是否适合我的用例,我被告知它是。我观看了 Google I/O 视频,阅读了文档,阅读了博客……(参见下面的列表)。我一直无法得到任何工作。我得到的最好的结果是让 SyncAdapter 帐户出现在全局“帐户和同步设置”中,但不能正常工作。即使这可行,它也不太理想,因为我希望用户除了从我的应用程序内部之外看不到该帐户。如果没有其他选项,这将是可以接受的,只要他们不需要访问它来设置它,因为一切都会默认为每天自动同步一次。

我什至尝试按原样使用 SampleSyncAdapter 并将断点放在身份验证代码部分中。没有命中一个断点,所以我看不到触发调用的内容或包含的数据。我原以为我至少会得到那么多。

尽管有建议,但我开始认为使用 SyncAdapter 是个坏主意。我还没有找到一个接近我想要的示例,更不用说教程或完整、有条理和清晰的文档了。这似乎应该是许多应用程序想要做的常见任务。

请在这篇文章中添加关于这个用例的任何好的文档。我一个也找不到。
如果没有这个,我认为向大家推荐不要在这个用例中使用 SyncAdapters 是公平的。我在这里不是在谈论其他用例,所以如果它不像我的用例,请不要继续讨论它是如何为您的用例工作的。

了解什么版本的 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

http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/

http://www.c99.org/2010/01/23/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

没有身份验证的 Android SyncAdapter 与 Android 服务

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

4

2 回答 2

6

总之答案是:ContentProviderAccountManager一起SyncAdapter去。你必须拥有这三件,即使它们是“哑巴”。

于 2011-12-23T09:40:27.320 回答
5

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

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+。

于 2012-02-02T15:28:20.237 回答