2011-01-11 13 views
7

Ich habe den BackupAgent wie unter Data Backup beschrieben implementiert, einen API-Schlüssel registriert und den BackupAgent in meinem Manifest deklariert. Der Backup-Teil funktioniert ziemlich gut, denke ich; Wenn ich adb shell bmgr run in der Befehlszeile ausführen, wird die folgende Ausgabe in LogCat:BackupAgent: "Paket kann nicht wiederhergestellt werden ..."

01-11 22:23:09.002: DEBUG/PerformBackupThread(97): starting agent for backup of BackupRequest{app=ApplicationInfo{4547c5b8 com.meins.nightclock} full=false} 
01-11 22:23:09.002: DEBUG/BackupManagerService(97): awaiting agent for ApplicationInfo{4547c5b8 com.meins.nightclock} 
01-11 22:23:09.013: DEBUG/BackupManagerService(97): agentConnected pkg=com.meins.nightclock [email protected] 
01-11 22:23:09.032: DEBUG/BackupHelperDispatcher(9122): handling existing helper 'alarms' [email protected] 
01-11 22:23:09.032: DEBUG/BackupHelperDispatcher(9122): handling existing helper 'prefs' [email protected] 
01-11 22:23:09.032: VERBOSE/LocalTransport(97): performBackup() pkg=com.meins.nightclock 
01-11 22:23:09.032: VERBOSE/LocalTransport(97): Got change set key=alarms:alarms size=16 key64=YWxhcm1zOmFsYXJtcw== 
01-11 22:23:09.042: VERBOSE/LocalTransport(97): data size 16 
01-11 22:23:09.062: VERBOSE/LocalTransport(97): Got change set key=prefs:com.meins.nightclock_preferences size=265 key64=cHJlZnM6Y29tLm1laW5zLm5pZ2h0Y2xvY2tfcHJlZmVyZW5jZXM= 
01-11 22:23:09.072: VERBOSE/LocalTransport(97): data size 265 
01-11 22:23:09.072: VERBOSE/LocalTransport(97): finishBackup() 

Der Teil auf der anderen Seite nicht wieder her überhaupt funktioniert, auf onReceive() Methode wird nicht aufgerufen. Wenn ich meine App installieren, die nur dann ausgegeben, die kann (?) Auf den Backupagent beziehen ist

01-11 22:14:01.042: DEBUG/vending(7426): [100] LocalAssetCache.updateOnePackage(): No local info for com.meins.nightclock 

Als ich adb shell bmgr restore com.meins.nightclock führen Sie es einfach erklärt Unable to restore package com.meins.nightclock.


Ich verwende die folgende Implementierung von BackupAgentHelper

package com.meins.nightclock; 

import java.io.IOException; 

import android.app.backup.BackupAgentHelper; 
import android.app.backup.BackupDataInput; 
import android.app.backup.BackupDataOutput; 
import android.app.backup.FileBackupHelper; 
import android.app.backup.SharedPreferencesBackupHelper; 
import android.os.ParcelFileDescriptor; 
import android.util.Log; 

public class MyBackupAgent extends BackupAgentHelper { 

    public static final Object[] DATA_LOCK = new Object[0]; 

    private static final String PREFS_BACKUP_KEY = "prefs"; 
    private static final String ALARMS_BACKUP_KEY = "alarms"; 

    private DataLayerAlarms d; 

    @Override 
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, 
      ParcelFileDescriptor newState) throws IOException { 

     if (d.backup() != 0) 
      return; 

     synchronized (DATA_LOCK) { 
      super.onBackup(oldState, data, newState); 
     } 
    } 

    @Override 
    public void onCreate() { 
     SharedPreferencesBackupHelper preferencesHelper = new SharedPreferencesBackupHelper(this, 
       getPackageName() + "_preferences"); 
     addHelper(PREFS_BACKUP_KEY, preferencesHelper); 

     FileBackupHelper fileHelper = new FileBackupHelper(this, DataLayerAlarms.BACKUP_FILE); 
     addHelper(ALARMS_BACKUP_KEY, fileHelper); 

     d = new DataLayerAlarms(this); 
    } 

    @Override 
    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) 
      throws IOException { 
     Log.d(toString(), "onRestore()"); 
     synchronized (DATA_LOCK) { 
      super.onRestore(data, appVersionCode, newState); 
     } 

     d.restore(); 
    } 

} 

Aus Gründen der Vollständigkeit der entsprechenden Manifest Teil:

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:debuggable="true" 
    android:backupAgent="MyBackupAgent"> 
    <meta-data 
     android:name="com.google.android.backup.api_key" 
     android:value="AEdPqrEAAAAI4MsUOC-[...]" /> 

    ... 

</application> 

Wer weiß, warum der Backupmanager ist Kann ich dieses Paket nicht wiederherstellen?

+0

Ich bekomme das gleiche. Ich habe gesehen, dass es funktioniert, aber auf einmal funktioniert es nicht mehr. – slott

+1

Ich auch. Es funktionierte, und plötzlich hörte es auf zu arbeiten. wie wtf .. – coolcool1994

Antwort

3

Versuchen Sie, einen Punkt vor Ihren Backup-Klassennamen hinzufügen, wie in:

android:backupAgent=".MyBackupAgent" 

Oder wenn Ihre Backup-Klasse ist in Ihrem Root-Paket nicht, fügen Sie den Pfad zu ihr:

android:backupAgent=".package.MyBackupAgent" 
0

Das Ändern android:backupAgent="MyBackupAgent" zu android:backupAgent=".MyBackupAgent" arbeitete für mich auch.

+0

funktioniert nicht für mich – abh22ishek

0

Dieses Problem trat auf, wenn ich den Paketnamen änderte und dann andere Probleme später auftraten. Ich brauchte ein paar Stunden, um es herauszufinden.

Disable Instant Run. Es hat Dinge für mich vermasselt.

Überprüfen Sie die Transporte Liste sicher, dass Google festgelegt ist:

adb shell bmgr list transports 
    android/com.android.internal.backup.LocalTransport 
    * com.google.android.gms/.backup.BackupTransportService 

Achten Sie darauf, das BackupAgentHelper Paketnamen und die Meta-Daten-Paket Name den gleichen Namen haben. Die Namenskonflikte könnten ein Problem verursachen.

android: Backupagent Der Name der Klasse, die die Anwendung des Backup-Agenten implementieren ist, eine Unterklasse von Backupagent. Das Attribut value sollte ein vollständig qualifizierter Klassenname sein (z. B. "com.example.project.MyBackupAgent"). Wenn jedoch das erste Zeichen des Namens ein Punkt ist (z. B. ".MyBackupAgent"), wird es an den Paketnamen angehängt, der im Element angegeben ist. Es gibt keinen Standard. Der Name muss angegeben werden.

Verwandte Themen