2014-01-31 51 views
1

我試過(沒有成功),以獲得我的大apk安裝(通過adb)從自定義java應用程序,儘管從stackoverflow的幫助和幾個實驗,總是似乎失敗(見Java Application to install APK on android)。android應用程序autoupdate如果apk存在然後刪除

它所安裝的應用程序和設備僅在離線狀態下未發佈到市場上。

我決定嘗試不同的路線來解決同樣的問題;我可以將apk從java應用程序推到/sdcard/MyApp/updates/update.apk

我想當用戶運行myapp時檢查update.apk是否存在,如果存在,運行更新以MYAPP。更新完成後,我希望update.apk被刪除(以防止每次應用程序啓動時發生更新循環)。我是新來的android,我不知道如何實現上述行爲。

我的代碼是非常稀疏的功能「塊」,但包括下面給出一個想法,我在想什麼:

if (update.exists()) { 
    try { 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/MyApp/updates" + "updates.apk")), "application/vnd.android.package-archive"); 
     startActivity(intent); 

} 
//add a delete to update.apk here AFTER it has finished installing 
} 

我的問題是:

是否有執行上述更好的辦法所需的功能? 如何確保update.apk在刪除之前已安裝並運行?

感謝您的幫助,正如我剛纔提到的,我是Java和Android的新手,並試圖通過戰鬥。

編輯:最終的解決方案我使用:

if (updateTxt.exists()) { 

      try { 
       BufferedReader br = new BufferedReader(
         new FileReader(updateTxt)); 
       String line; 

       while ((line = br.readLine()) != null) { 
        String line2[] = line.split(" "); // split the string to get 
                 // the 
                 // progress 
        myUpdateVersion = Integer.parseInt(line2[0]); // [0] is the 
                    // value we 
                    // are 
                    // interested 
                    // in 
                    // so set 
                    // it. 
       } 

      } catch (IOException ex) { 
       return; 
      } 
     } else { 
      // no update so do nothing 
     } 

     if (updateApk.exists()) { 
      // updateIntent(); 
      // now check the version of the update file to see if it can be 
      // deleted 
      PackageManager packageManager = getPackageManager(); 
      PackageInfo apkPackageInfo = packageManager.getPackageInfo(
        "com.myapp.myapp", 0); 
      if (apkPackageInfo != null) { 
       if (apkPackageInfo.versionCode == myUpdateVersion) { 
        // Update has been installed. Delete update APK 
        updateApk.delete(); 
       } else { 
        // Update needs to be installed 
        updateIntent(); 
       } 
      } else { 
       // no update so do nothing 
      } 
     } 

    } // end updateApk 

    public void updateIntent() { 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(
       Uri.fromFile(new File(Environment.getExternalStorageDirectory() 
         + "/updates/update.apk")), 
       "application/vnd.android.package-archive"); 
     startActivity(intent); 
    } 

安迪

回答

1

你正在服用的方法是好的,效果很好。您需要了解您的現有應用程序將被關閉(殺死)以執行更新。用戶需要手動返回到您的應用程序。

爲了刪除APK以避免無限循環,您需要知道更新的版本號。如果您知道(也許您將它作爲文件名的一部分或其他方式),則可以將其與正在運行的應用程序的版本進行比較。如果它們相同,則可以確定您的更新已安裝,並且您可以刪除更新APK。

要確定運行的版本,你可以使用以下命令:

PackageManager packageManager = getPackageManager(); 
    PackageInfo apkPackageInfo = packageManager.getPackageInfo("your.package.name", 0); 
    if (apkPackageInfo != null) { 
     if (apkPackageInfo.versionCode == myUpdateVersion) { 
      // Update has been installed. Delete update APK 
     } else { 
      // Update needs to be installed 
    } 
+0

大衛,感謝您的回答,我已經編輯我上面的帖子顯示我最終使用的代碼。 – andy

相關問題