SyncAdapter без учетной записи - PullRequest
       29

SyncAdapter без учетной записи

8 голосов
/ 19 декабря 2011

Я пытаюсь создать SyncAdapter для своего приложения для Android, чтобы показывать видео YouTube с одного определенного канала.Видео является общедоступным, поэтому я не хочу, чтобы пользователь входил в систему, создавал учетную запись, проходил аутентификацию, загружал данные или использовал базу данных контактов.Я просто хочу, чтобы SyncAdapter периодически обновлял базу данных моего приложения новейшими метаданными видео с этого канала.Я уже создал ContentProvider для доступа к своей базе данных.Мне нравится тот факт, что SyncProvider будет обрабатывать возможность отключать синхронизацию, планирование и повторные попытки отката для обновления.

Ранее я спросил, является ли SyncAdapter хорошим выбором для моего варианта использования, и мне сказали, что это так.Я смотрел видео ввода / вывода Google, читал документы, читал блоги ... (см. Список ниже).Я был не в состоянии заставить что-либо работать.Лучшее, что я получил, - это чтобы учетная запись 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 / месть-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 не запускает синхронизацию?

Ответы [ 2 ]

6 голосов
/ 23 декабря 2011

Короче говоря, ответ: ContentProvider, AccountManager и SyncAdapter идут вместе.У вас должны быть эти три части, даже если они «тупые».

5 голосов
/ 02 февраля 2012

Как указано выше, «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 +.

...