2011-01-11 8 views
7

Tôi đã triển khai BackupAgent như được mô tả tại Data Backup, đã đăng ký khóa API và đã khai báo BackupAgent trong Tệp kê khai của tôi. Công việc sao lưu một phần khá tốt, tôi nghĩ vậy; Khi tôi chạy adb shell bmgr run trong dòng lệnh, đầu ra sau đây xuất hiện trong LogCat:BackupAgent: "không thể khôi phục gói ..."

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

Các khôi phục một phần mặt khác không làm việc ở tất cả, trên onReceive() phương pháp không được gọi. Khi tôi cài đặt lại ứng dụng của tôi, kết quả chỉ có thể (?) Tham khảo các BackupAgent là

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

Khi tôi chạy adb shell bmgr restore com.meins.nightclock nó chỉ đơn giản nói Unable to restore package com.meins.nightclock.


Tôi đang sử dụng thi hành sau 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(); 
    } 

} 

Vì lợi ích của sự hoàn chỉnh phần Manifest liên quan:

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

Có ai biết, tại sao BackupManager là không thể khôi phục gói này?

+0

Tôi cũng nhận được điều tương tự. Tôi đã thấy nó hoạt động nhưng đột nhiên nó không còn hoạt động nữa. – slott

+1

Tôi cũng thế. Nó đang hoạt động, và đột nhiên nó ngừng hoạt động. như wtf .. – coolcool1994

Trả lời

3

Hãy thử thêm một dấu chấm trước tên lớp sao lưu của bạn, như trong:

android:backupAgent=".MyBackupAgent" 

Hoặc nếu lớp sao lưu của bạn không có trong gói gốc của bạn, thêm đường dẫn đến nó:

android:backupAgent=".package.MyBackupAgent" 
0

Thay đổi android:backupAgent="MyBackupAgent" thành android:backupAgent=".MyBackupAgent" cũng đã làm việc cho tôi.

+0

không hoạt động đối với tôi – abh22ishek

0

Sự cố này xảy ra khi tôi thay đổi tên gói và sau đó xuất hiện các sự cố khác. Tôi mất một vài giờ để tìm ra.

Tắt tính năng Chạy tức thì. Nó làm rối tung mọi thứ cho tôi.

Kiểm tra danh sách vận chuyển, đảm bảo Google được thiết lập:

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

Hãy chắc chắn rằng tên gói BackupAgentHelper và tên gói siêu dữ liệu có cùng tên. Xung đột tên có thể gây ra sự cố.

android: backupAgent Tên của lớp triển khai là tác nhân dự phòng của ứng dụng, một phân lớp của BackupAgent. Thuộc tính giá trị phải là tên lớp đủ điều kiện (chẳng hạn như, "com.example.project.MyBackupAgent"). Tuy nhiên, dưới dạng viết tắt, nếu ký tự đầu tiên của tên là là một khoảng thời gian (ví dụ: ".MyBackupAgent"), nó được nối thêm vào tên gói được chỉ định trong phần tử . Không có mặc định. Tên phải được chỉ định.