Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自動檢測版本及自動升級

Android自動檢測版本及自動升級

編輯:關於Android編程

步驟:

1.檢測當前版本的信息AndroidManifest.xml-->manifest-->android:versionName。

2.從服務器獲取版本號(版本號存在於xml文件中)並與當前檢測到的版本進行匹配,如果不匹配,提示用戶進行升級,如果匹配則進入程序主界面。

3.當提示用戶進行版本升級時,如果用戶點擊了確定,系統將自動從服務器上下載並進行自動升級,如果點擊取消將進入程序主界面。

效果圖:

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316483332.gif data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316483390.gif

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316483480.gif data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022316483428.gif

獲取當前程序的版本號:

 

[java]  
  1. /*
  2. * 獲取當前程序的版本號
  3. */
  4. private String getVersionName() throws Exception{
  5. //獲取packagemanager的實例
  6. PackageManager packageManager = getPackageManager();
  7. //getPackageName()是你當前類的包名,0代表是獲取版本信息
  8. PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(), 0);
  9. return packInfo.versionName;
  10. } 獲取服務器端的版本號:

     

     

    [java] 
    1. /*
    2. * 用pull解析器解析服務器返回的xml文件 (xml封裝了版本號)
    3. */
    4. public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
    5. XmlPullParser parser = Xml.newPullParser();
    6. parser.setInput(is, utf-8);//設置解析的數據源
    7. int type = parser.getEventType();
    8. UpdataInfo info = new UpdataInfo();//實體
    9. while(type != XmlPullParser.END_DOCUMENT ){
    10. switch (type) {
    11. case XmlPullParser.START_TAG:
    12. if(version.equals(parser.getName())){
    13. info.setVersion(parser.nextText()); //獲取版本號
    14. }else if (url.equals(parser.getName())){
    15. info.setUrl(parser.nextText()); //獲取要升級的APK文件
    16. }else if (description.equals(parser.getName())){
    17. info.setDescription(parser.nextText()); //獲取該文件的信息
    18. }
    19. break;
    20. }
    21. type = parser.next();
    22. }
    23. return info;
    24. } 從服務器下載apk:

       

       

      [java] 
      1. public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
      2. //如果相等的話表示當前的sdcard掛載在手機上並且是可用的
      3. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
      4. URL url = new URL(path);
      5. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      6. conn.setConnectTimeout(5000);
      7. //獲取到文件的大小
      8. pd.setMax(conn.getContentLength());
      9. InputStream is = conn.getInputStream();
      10. File file = new File(Environment.getExternalStorageDirectory(), updata.apk);
      11. FileOutputStream fos = new FileOutputStream(file);
      12. BufferedInputStream bis = new BufferedInputStream(is);
      13. byte[] buffer = new byte[1024];
      14. int len ;
      15. int total=0;
      16. while((len =bis.read(buffer))!=-1){
      17. fos.write(buffer, 0, len);
      18. total+= len;
      19. //獲取當前下載量
      20. pd.setProgress(total);
      21. }
      22. fos.close();
      23. bis.close();
      24. is.close();
      25. return file;
      26. }
      27. else{
      28. return null;
      29. }
      30. }

        匹配、下載、自動安裝:

         

         

        [java] 
        1. /*
        2. * 從服務器獲取xml解析並進行比對版本號
        3. */
        4. public class CheckVersionTask implements Runnable{
        5.  
        6. public void run() {
        7. try {
        8. //從資源文件獲取服務器 地址
        9. String path = getResources().getString(R.string.serverurl);
        10. //包裝成url的對象
        11. URL url = new URL(path);
        12. HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        13. conn.setConnectTimeout(5000);
        14. InputStream is =conn.getInputStream();
        15. info = UpdataInfoParser.getUpdataInfo(is);
        16.  
        17. if(info.getVersion().equals(versionname)){
        18. Log.i(TAG,版本號相同無需升級);
        19. LoginMain();
        20. }else{
        21. Log.i(TAG,版本號不同 ,提示用戶升級 );
        22. Message msg = new Message();
        23. msg.what = UPDATA_CLIENT;
        24. handler.sendMessage(msg);
        25. }
        26. } catch (Exception e) {
        27. // 待處理
        28. Message msg = new Message();
        29. msg.what = GET_UNDATAINFO_ERROR;
        30. handler.sendMessage(msg);
        31. e.printStackTrace();
        32. }
        33. }
        34. }
        35.  
        36. Handler handler = new Handler(){
        37.  
        38. @Override
        39. public void handleMessage(Message msg) {
        40. // TODO Auto-generated method stub
        41. super.handleMessage(msg);
        42. switch (msg.what) {
        43. case UPDATA_CLIENT:
        44. //對話框通知用戶升級程序
        45. showUpdataDialog();
        46. break;
        47. case GET_UNDATAINFO_ERROR:
        48. //服務器超時
        49. Toast.makeText(getApplicationContext(), 獲取服務器更新信息失敗, 1).show();
        50. LoginMain();
        51. break;
        52. case DOWN_ERROR:
        53. //下載apk失敗
        54. Toast.makeText(getApplicationContext(), 下載新版本失敗, 1).show();
        55. LoginMain();
        56. break;
        57. }
        58. }
        59. };
        60.  
        61. /*
        62. *
        63. * 彈出對話框通知用戶更新程序
        64. *
        65. * 彈出對話框的步驟:
        66. * 1.創建alertDialog的builder.
        67. * 2.要給builder設置屬性, 對話框的內容,樣式,按鈕
        68. * 3.通過builder 創建一個對話框
        69. * 4.對話框show()出來
        70. */
        71. protected void showUpdataDialog() {
        72. AlertDialog.Builder builer = new Builder(this) ;
        73. builer.setTitle(版本升級);
        74. builer.setMessage(info.getDescription());
        75. //當點確定按鈕時從服務器上下載 新的apk 然後安裝
        76. builer.setPositiveButton(確定, new OnClickListener() {
        77. public void onClick(DialogInterface dialog, int which) {
        78. Log.i(TAG,下載apk,更新);
        79. downLoadApk();
        80. }
        81. });
        82. //當點取消按鈕時進行登錄
        83. builer.setNegativeButton(取消, new OnClickListener() {
        84. public void onClick(DialogInterface dialog, int which) {
        85. // TODO Auto-generated method stub
        86. LoginMain();
        87. }
        88. });
        89. AlertDialog dialog = builer.create();
        90. dialog.show();
        91. }
        92.  
        93. /*
        94. * 從服務器中下載APK
        95. */
        96. protected void downLoadApk() {
        97. final ProgressDialog pd; //進度條對話框
        98. pd = new ProgressDialog(this);
        99. pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        100. pd.setMessage(正在下載更新);
        101. pd.show();
        102. new Thread(){
        103. @Override
        104. public void run() {
        105. try {
        106. File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);
        107. sleep(3000);
        108. installApk(file);
        109. pd.dismiss(); //結束掉進度條對話框
        110. } catch (Exception e) {
        111. Message msg = new Message();
        112. msg.what = DOWN_ERROR;
        113. handler.sendMessage(msg);
        114. e.printStackTrace();
        115. }
        116. }}.start();
        117. }
        118.  
        119. //安裝apk
        120. protected void installApk(File file) {
        121. Intent intent = new Intent();
        122. //執行動作
        123. intent.setAction(Intent.ACTION_VIEW);
        124. //執行的數據類型
        125. intent.setDataAndType(Uri.fromFile(file), application/vnd.android.package-archive);
        126. startActivity(intent);
        127. }
        128.  
        129. /*
        130. * 進入程序的主界面
        131. */
        132. private void LoginMain(){
        133. Intent intent = new Intent(this,MainActivity.class);
        134. startActivity(intent);
        135. //結束掉當前的activity
        136. this.finish();
        137. }


          UpdataInfo:

          [java] 
          1. public class UpdataInfo {
          2. private String version;
          3. private String url;
          4. private String description;
          5. public String getVersion() {
          6. return version;
          7. }
          8. public void setVersion(String version) {
          9. this.version = version;
          10. }
          11. public String getUrl() {
          12. return url;
          13. }
          14. public void setUrl(String url) {
          15. this.url = url;
          16. }
          17. public String getDescription() {
          18. return description;
          19. }
          20. public void setDescription(String description) {
          21. this.description = description;
          22. }
          23. }


            update.xml:

            [html] 
            1. 2.0
            2. http://192.168.1.187:8080/mobilesafe.apk
            3. 檢測到最新版本,請及時更新!
            4.  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved