BackupManager, не вызывающий резервный транспорт

Хорошо, поэтому я пытаюсь реализовать Data Backup в своем приложении и следую этому руководству . Я реализовал свой BackupAgentHelper с помощью SharedPreferencesBackupHelper . Я не получаю никаких ошибок, и я уверен, что вы вызове dataChanged() после всех изменений предпочтений, но когда я тестирую резервную копию (`bbgr run adb shell), я получаю эту информацию в LogCat:

 07-07 12:29:00.258: V/BackupManagerService(291): Scheduling immediate backup pass 07-07 12:29:00.258: V/BackupManagerService(291): Running a backup pass 07-07 12:29:00.258: V/BackupManagerService(291): clearing pending backups 07-07 12:29:00.258: V/PerformBackupTask(291): Beginning backup of 1 targets 07-07 12:29:00.289: V/BackupServiceBinder(291): doBackup() invoked 07-07 12:29:00.289: D/PerformBackupTask(291): invokeAgentForBackup on @pm@ 07-07 12:29:00.297: I/PerformBackupTask(291): no backup data written; not calling transport 

Итак, для справки, в моем манифесте я добавил:

 <application android:allowBackup="true" android:backupAgent="com.kcoppock.sudoku.SudokuBackupAgent" 

так же как

 <meta-data android:name="com.google.android.backup.api_key" android:value="my_key_goes_here" /> 

И моя BackupAgentHelper реализована так:

 public class SudokuBackupAgent extends BackupAgentHelper { static final String SCORES = "SCORES"; static final String BACKUP_ID = "sudoku_backup"; @Override public void onCreate() { SharedPreferencesBackupHelper backupHelper = new SharedPreferencesBackupHelper(this, SCORES); addHelper(BACKUP_ID, backupHelper); } } 

И, наконец, в моем основном действии я призываю к резервному копированию данных следующим образом:

 edit.putString(id + "_values", valueCache.toString()); edit.putString(id + "_hints", hintCache.toString()); edit.commit(); BackupManager backup = new BackupManager(this); backup.dataChanged(); 

Я пробовал отладку, и кажется, что мой onCreate() в SudokuBackupAgent никогда не вызывается. Или, по крайней мере, это никогда не достигается из отладчика. Кажется, что он не находит никаких обновленных данных, и я дважды проверял, чтобы обеспечить их резервное копирование. Здесь что-то не хватает?

EDIT : я должен добавить, я тестирую на устройстве (Galaxy Nexus), и я даже пытался использовать APK с экспортированным выпуском для тестирования.

    1) Поместите Log.i () в свой onCreate, чтобы узнать, вызвана ли она.

    2) Logcat указывает, что ваша функция ничего не записывала. Проверьте, есть ли файл share_prefs / SCORES в частной папке вашего приложения (предполагается использование соответствующего файлового менеджера на корневом устройстве). Это файл, который вы пытаетесь создать в резервной копии. Вероятно, ваш файл настроек – это нечто иное, чем этот файл, в таком случае исправьте String SCORES, чтобы отобразить файл реальных настроек.

    3) Я попытался отлаживать BackupAgentHelper.onCreate в своем приложении, и его можно отлаживать после вызова adb shell bmgt … поэтому здесь можно отступить в отладчике.

    Сегодня у меня была такая же проблема с Android SDK 4.1. Однако использование версий 2.3.3 помогло:

     07-15 13:59:56.459: V/LocalTransport(61): performBackup() pkg=com........ 07-15 13:59:56.469: V/LocalTransport(61): Got change set key=filehelper:../databases/database.db size=8208 key64=ZmlsZWhlbHBlcjouLi8kYXRhYmFzZXMvZXhwZW5zZXIuZGI= 07-15 13:59:56.469: V/LocalTransport(61): data size 8208 07-15 13:59:56.469: V/LocalTransport(61): finishBackup() 

    Если вы не измените данные своих настроек, он будет только один раз, но не позже.

    https://developer.android.com/reference/android/app/backup/SharedPreferencesBackupHelper.html

    «Всякий раз, когда выполняется резервное копирование, он создает резервные копии всех именованных общих настроек, которые были изменены с момента последней операции резервного копирования».

    Как сказал другой плакат, обязательно сделайте запись в журнале onCreate.

    Вы можете принудительно создать резервную копию:

     // bmgr wipe TRANSPORT PACKAGE bmgr wipe com.google.android.backup/.BackupTransportService com.kcoppock.sudoku bmgr run 

    По умолчанию используется com.google.android.backup/.BackupTransportService , но лучше всего проверить себя с помощью bmgr list transports .

    Вы будете намного счастливее работать против локального транспорта, а не по умолчанию Google Transport. Проверьте dev docs на этом.