2011-01-11 17 views
7

Ho implementato il BackupAgent come descritto in Data Backup, registrato una chiave API e dichiarato BackupAgent nel mio manifest. La parte di backup funziona abbastanza bene, penso; Quando corro adb shell bmgr run in linea di comando, il seguente output appare in LogCat:BackupAgent: "impossibile ripristinare il pacchetto ..."

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() 

Il ripristino parte invece non funziona affatto, onReceive() metodo non viene chiamato. Quando ho reinstallato il mio app, l'unica uscita che può (?) Si riferiscono al BackupAgent è

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

Quando eseguo adb shell bmgr restore com.meins.nightclock afferma semplicemente Unable to restore package com.meins.nightclock.


Sto usando la seguente implementazione di 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(); 
    } 

} 

Per ragioni di completezza parte Manifesto rilevanti:

<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> 

Qualcuno sa, perché il BackupManager è impossibile ripristinare questo pacchetto?

+0

Sto ottenendo la stessa cosa. L'ho visto funzionare ma all'improvviso non funziona più. – slott

+1

Anch'io. Stava funzionando e all'improvviso ha smesso di funzionare. come wtf .. – coolcool1994

risposta

3

provare ad aggiungere un punto prima il backup nome della classe, come:

android:backupAgent=".MyBackupAgent" 

O se la vostra classe di backup non è nel pacchetto principale, aggiungere il percorso ad esso:

android:backupAgent=".package.MyBackupAgent" 
0

Il cambio da android:backupAgent="MyBackupAgent" a android:backupAgent=".MyBackupAgent" ha funzionato anche per me.

+0

non funziona per me – abh22ishek

0

Questo problema si è verificato quando ho cambiato il nome del pacchetto, quindi sono apparsi altri problemi successivamente. Mi ci sono volute un paio d'ore per capire.

Disattiva esecuzione istantanea. Ha incasinato le cose per me.

Controllare l'elenco trasporti, assicurarsi che Google sia impostato:

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

Assicurarsi che il nome del pacchetto BackupAgentHelper e il nome del pacchetto meta-dati hanno lo stesso nome. I conflitti di nome potrebbero causare un problema.

android: backupAgent Il nome della classe che implementa l'agente di backup dell'applicazione , una sottoclasse di BackupAgent. Il valore dell'attributo deve essere un nome di classe completo (ad esempio, "com.example.project.MyBackupAgent"). Tuttavia, in forma abbreviata, se il primo carattere del nome è un punto (ad esempio, ". MyBackupAgent"), viene aggiunto al nome del pacchetto specificato nell'elemento . Non esiste un valore predefinito. Il nome deve essere specificato.

Problemi correlati