没有帐户的SyncAdapter

时间:2011-12-18 20:46:16

标签: android accountmanager android-syncadapter

我正在尝试为我的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 without Authentication vs. Android Service

Why does ContentResolver.requestSync not trigger a sync?

2 个答案:

答案 0 :(得分:6)

简而言之,答案是:ContentProviderAccountManagerSyncAdapter齐头并进。你必须拥有这三件,即使他们是“哑巴”。

答案 1 :(得分: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 +。