2016-05-08 47 views
1

我想驗證應用程序升級到最新版本並執行操作的情況。考慮用戶手機上的應用程序版本是2.4。他/她從Play Store升級到最新版本(2.5)。我會檢查它是否是升級後的第一次運行並顯示對話框。 (我正在使用此處給出的解決方案:Check if application is on its first run驗證首次發佈)僅在應用程序升級時顯示對話框

但是,如何在將更新推送到Play商店之前驗證此類場景。我已經試過是:

  1. 從商店安裝應用程序手動
  2. 運行於Android工作室在調試/發佈模式的最新版本。

但是當我做以上,我得到以下錯誤: INSTALL_FAILED_UPDATE_INCOMPATIBLE

我也嘗試安裝從舊的APK,我有應用,但得到了同樣的錯誤,同時驗證升級。

是否有任何其他方法可以用來驗證對話框是否僅在用戶將應用升級到最新版本時出現?

回答

2

我想是因爲簽名是不存儲版本(由您發佈密鑰簽名),並且通過調試密鑰簽名的工作室運行版本之間的相同你收到此錯誤(在Android中數據文件夾中)

所以這是關於錯誤,您必須構建APK,就好像您將其上傳到商店一樣,並使用您的發行密鑰庫對其進行簽名......然後將其安裝到設備上(使用adb install或adb push然後從手機,或複製apk到手機內存,然後從手機安裝...等)也許?

現在針對第二部分,在應用更新後檢測應用/檢測第一次運行的第一次運行,您可以按照該回答的建議使用SharedPreferences。但這還不夠,因爲它不會被應用程序版本鏈接/影響,這就是升級後需要檢測第一次運行的內容。

您需要做的是獲取您在清單文件android:versionCode上指定的應用程序版本碼(它是整數),並且每次將版本上載到PlayStore時都必須增加它。

該代碼會做你需要什麼(你可以用它在活動/片段,你希望顯示在對話框中)

//this code gets current version-code (after upgrade it will show new versionCode) 
PackageManager manager = this.getPackageManager(); 
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0); 
int versionCode = info.versionCode; 
SharedPreferences prefs = this.getSharedPreferences("yourAppName", Context.MODE_PRIVATE); 
if(prefs.getInt("last_version_code", -1) > 0){ 
    if(prefs.getInt("last_version_code", -1) != versionCode){ 
     //save current versionCode: 1st-run after upgrade 
     prefs.edit().putInt("last_version_code", versionCode).commit(); 

     //put show the dialog code here... 
    } //no need for else, because app version did not change... 
}else{ 
    //save current versionCode for 1st-run ever 
    prefs.edit().putInt("last_version_code", versionCode).commit(); 
} 

prefs.getInt("last_version_code", -1)這將在首選項獲得最後保存價值的關鍵last_version_code並且如果沒有值(第一次運行),它將返回默認值-1

if檢查首選項> 0(不是首先運行) 返回的值,它不等於清單中的值。這將意味着(升級版)在

==-1情況下,你只寫你試圖獲取價值,如果你想使用它,因爲它會返回一個數字(保存的最後一個版本的代碼)

中的versionCode所以下一次的方法(可能在多個地方被調用) 創建一個方法返回true/false,如果應用程序進行了更新

public static boolean appWasUpdated(Context context){ 
    //this code gets current version-code (after upgrade it will show new versionCode) 
    PackageManager manager = context.getPackageManager(); 
    PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); 
    int versionCode = info.versionCode; 
    SharedPreferences prefs = context.getSharedPreferences("yourAppName", Context.MODE_PRIVATE); 
    if(prefs.getInt("last_version_code", -1) > 0){ 
     if(prefs.getInt("last_version_code", -1) != versionCode){ 
      //save current versionCode: 1st-run after upgrade 
      prefs.edit().putInt("last_version_code", versionCode).commit(); 

      return true; 
     } //no need for else, because app version did not change... 
    }else{ 
     //save current versionCode for 1st-run ever 
     prefs.edit().putInt("last_version_code", versionCode).commit(); 
    } 
    return false; 
} 

並調用從活動這個方法/片段

if(appWasUpdated(this)){ 
    showMyDialog(); 
} 
0
  1. 增加APK的versionCode。它應該高於Store中APK的versionCode。

  2. 使用相同的密鑰庫簽署APK並進行發佈構建。

  3. 從商店下載舊APK。

  4. 將新版APK推送到您的設備。 adb push myapp.apk /sdcard/0/adb install在這種情況下不起作用。

  5. 從手機上安裝新的APK。它會更新現有的應用程序。

相關問題