Подтвердить что ты не робот

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

Хорошо, поэтому я пытаюсь реализовать Data Backup в своем приложении и следую этому руководству. Я выполнил мой BackupAgentHelper с помощью SharedPreferencesBackupHelper. Я не получаю никаких ошибок, и я обязательно позвоню dataChanged() после всех изменений предпочтений, но когда я тестирую резервную копию ( "запуск bmgr для 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 @[email protected]
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 с экспортированным выпуском для тестирования.

4b9b3361

Ответ 1

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

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

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

Ответ 2

У меня была такая же проблема сегодня с 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()

Ответ 3

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

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

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

Как сказал другой плакат, обязательно сделайте оператор log в своем 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 на этом.