2011-01-11 66 views
7

我已经实施了BackupAgent,如Data Backup所述,注册了API密钥并在我的Manifest中声明了BackupAgent。 我认为备份部分的工作很好,当我在命令行中运行adb shell bmgr run,以下输出出现在logcat中:在另一方面BackupAgent:“无法恢复包...”

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

还原部分没有在所有的工作,对onReceive()方法不叫。当我重新安装我的应用程序,它可以(?)是指BackupAgent唯一的输出是

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

当我运行adb shell bmgr restore com.meins.nightclock它只是说Unable to restore package com.meins.nightclock


我使用以下实现的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(); 
    } 

} 

为了完整起见,相关清单部分:

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

有谁知道,为什么BackupManager是无法恢复这个包?

+0

我得到同样的事情。我已经看到它的工作,但突然它不再工作。 – slott 2013-08-23 08:51:05

+1

我也是。它正在工作,并突然停止工作。像wtf .. – coolcool1994 2014-12-14 09:57:14

回答

3

尝试在备份类名前加一个圆点,如:

android:backupAgent=".MyBackupAgent" 

或者,如果你的备份类不在你的根包,路径添加到它:

android:backupAgent=".package.MyBackupAgent" 
0

android:backupAgent="MyBackupAgent"更改为android:backupAgent=".MyBackupAgent"也适用于我。

0

当我更改软件包名称,然后出现其他问题时,会发生此问题。我花了几个小时才弄清楚。

禁用即时运行。它让我感到困惑。

检查运输清单,确保谷歌设置:

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

确保BackupAgentHelper包名和元数据包的名称具有相同的名称。名称冲突可能会导致问题。

android:backupAgent实现的应用程序的备份代理类的名称,该备份代理是BackupAgent的一个子类。属性 值应该是完全限定的类名称(例如, “com.example.project.MyBackupAgent”)。然而,作为一个速记,如果名称的 第一个字符是一个时间段(例如, “.MyBackupAgent”),它被附加到在 元素中指定的包名。没有默认值。该名称必须指定。