首页 > 代码库 > Android 应用检查更新并下载

Android 应用检查更新并下载

1.在Android应用当中都有应用检查更新的要求,往往都是在打开应用的时候去更新下载。

实现的方法是:服务器端提供接口,接口中可以包含在最新APK下载的URL,最新APK的VersionCode,等附带信息。

将最新APK的Versioncode与当前的APP的VersionCode做大小比较就可以知道是否是最新版本,如果是最新版本就下载安装。

2.效果图:

                 

4.上代码:

借用别人的接口:http://jcodecraeer.com/update.php

AppVersion:是版本信息的模型类,基本上和服务端返回的东西是相对应的。

DownloadService:是下载模块。

UpdateChecker:是检查更新,调用下载模块,下载完安装的工具类。

PS:注意Service在Manifest.xml中要申明。

AppVersion

 1 public class AppVersion { 2  3     private String updateMessage; 4     private String apkUrl; 5     private int apkCode; 6     public static final String APK_DOWNLOAD_URL = "url"; 7     public static final String APK_UPDATE_CONTENT = "updateMessage"; 8     public static final String APK_VERSION_CODE = "versionCode"; 9 10     public String getUpdateMessage() {11         return updateMessage;12     }13 14     public void setUpdateMessage(String updateMessage) {15         this.updateMessage = updateMessage;16     }17 18     public String getApkUrl() {19         return apkUrl;20     }21 22     public void setApkUrl(String apkUrl) {23         this.apkUrl = apkUrl;24     }25 26     public int getApkCode() {27         return apkCode;28     }29 30     public void setApkCode(int apkCode) {31         this.apkCode = apkCode;32     }33 34 }

 

 DownloadService:

 1 public class DownloadService extends IntentService { 2  3     public static final int UPDATE_PROGRESS = 8344; 4  5     public DownloadService() { 6         super("DownloadService"); 7     } 8  9     @Override10     protected void onHandleIntent(Intent intent) {11         String urlToDownload = intent.getStringExtra("url");12         System.out.println("URLtOdOWNLOAD-->>" +urlToDownload);13         String fileDestination = intent.getStringExtra("dest");14         ResultReceiver receiver = (ResultReceiver) intent15                 .getParcelableExtra("receiver");16         try {17             URL url = new URL(urlToDownload);18             URLConnection connection = url.openConnection();19             connection.connect();20             // this will be useful so that you can show a typical 0-100%21             // progress bar22             int fileLength = connection.getContentLength();23             // download the file24             InputStream input = new BufferedInputStream(25                     connection.getInputStream());26             OutputStream output = new FileOutputStream(fileDestination);27             byte data[] = new byte[100];28             long total = 0;29             int count;30             while ((count = input.read(data)) != -1) {31                 total += count;32                 // publishing the progress....33                 Bundle resultData = http://www.mamicode.com/new Bundle();34                 resultData.putInt("progress", (int) (total * 100 / fileLength));35                 receiver.send(UPDATE_PROGRESS, resultData);36                 output.write(data, 0, count);37             }38             output.flush();39             output.close();40             input.close();41         } catch (IOException e) {42             e.printStackTrace();43         }44         Bundle resultData = http://www.mamicode.com/new Bundle();45         resultData.putInt("progress", 100);46         receiver.send(UPDATE_PROGRESS, resultData);47     }48 }

 

UpdateChecker:

  1 public class UpdateChecker {  2     private static final String TAG = "UpdateChecker";  3     private Context mContext;  4     // 检查版本信息的线程  5     private Thread mThread;  6     // 版本对比地址  7     private String mCheckUrl;  8     private AppVersion mAppVersion;  9     // 下载apk的对话框 10     private ProgressDialog mProgressDialog; 11  12     private File apkFile; 13  14     public void setCheckUrl(String url) { 15         mCheckUrl = url; 16     } 17  18     public UpdateChecker(Context context) { 19         mContext = context; 20         // instantiate it within the onCreate method 21         mProgressDialog = new ProgressDialog(context); 22         mProgressDialog.setMessage("正在下载"); 23         mProgressDialog.setIndeterminate(false); 24         mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 25         mProgressDialog.setCancelable(true); 26         mProgressDialog 27                 .setOnCancelListener(new DialogInterface.OnCancelListener() { 28                     @Override 29                     public void onCancel(DialogInterface dialog) { 30  31                     } 32                 }); 33         mProgressDialog 34                 .setOnDismissListener(new DialogInterface.OnDismissListener() { 35                     @Override 36                     public void onDismiss(DialogInterface dialog) { 37                         // TODO Auto-generated method stub 38  39                     } 40                 }); 41     } 42  43     public void checkForUpdates() { 44         if (mCheckUrl == null) { 45             // throw new Exception("checkUrl can not be null"); 46             return; 47         } 48         final Handler handler = new Handler() { 49             public void handleMessage(Message msg) { 50                 if (msg.what == 1) { 51                     mAppVersion = (AppVersion) msg.obj; 52                     try { 53                         int versionCode = mContext.getPackageManager() 54                                 .getPackageInfo(mContext.getPackageName(), 0).versionCode; 55                         System.out.println("version-->" + versionCode 56                                 + "  mAppVersion.getApkCode()-->>" 57                                 + mAppVersion.getApkCode()); 58                         if (mAppVersion.getApkCode() > versionCode) { 59                             showUpdateDialog(); 60                         } else { 61                             Toast.makeText(mContext, "已经是最新版本", 62                                     Toast.LENGTH_SHORT).show(); 63                         } 64                     } catch (PackageManager.NameNotFoundException ignored) { 65                         // 66                     } 67                 } 68             } 69         }; 70  71         mThread = new Thread() { 72             @Override 73             public void run() { 74                 // if (isNetworkAvailable(mContext)) { 75                 Message msg = new Message(); 76                 String json = sendPost(); 77                 Log.i("jianghejie", "json = " + json); 78                 if (json != null) { 79                     AppVersion appVersion = parseJson(json); 80                     msg.what = 1; 81                     msg.obj = appVersion; 82                     handler.sendMessage(msg); 83                 } else { 84                     Log.e(TAG, "can‘t get app update json"); 85                 } 86             } 87         }; 88         mThread.start(); 89     } 90  91     protected String sendPost() { 92         HttpURLConnection uRLConnection = null; 93         InputStream is = null; 94         BufferedReader buffer = null; 95         String result = null; 96         try { 97             URL url = new URL(mCheckUrl); 98             uRLConnection = (HttpURLConnection) url.openConnection(); 99             uRLConnection.setDoInput(true);100             uRLConnection.setDoOutput(true);101             uRLConnection.setRequestMethod("POST");102             uRLConnection.setUseCaches(false);103             uRLConnection.setConnectTimeout(10 * 1000);104             uRLConnection.setReadTimeout(10 * 1000);105             uRLConnection.setInstanceFollowRedirects(false);106             uRLConnection.setRequestProperty("Connection", "Keep-Alive");107             uRLConnection.setRequestProperty("Charset", "UTF-8");108             uRLConnection109                     .setRequestProperty("Accept-Encoding", "gzip, deflate");110             uRLConnection111                     .setRequestProperty("Content-Type", "application/json");112             uRLConnection.connect();113             is = uRLConnection.getInputStream();114             String content_encode = uRLConnection.getContentEncoding();115             if (null != content_encode && !"".equals(content_encode)116                     && content_encode.equals("gzip")) {117                 is = new GZIPInputStream(is);118             }119             buffer = new BufferedReader(new InputStreamReader(is));120             StringBuilder strBuilder = new StringBuilder();121             String line;122             while ((line = buffer.readLine()) != null) {123                 strBuilder.append(line);124             }125             result = strBuilder.toString();126         } catch (Exception e) {127             Log.e(TAG, "http post error", e);128         } finally {129             if (buffer != null) {130                 try {131                     buffer.close();132                 } catch (IOException e) {133                     e.printStackTrace();134                 }135             }136             if (is != null) {137                 try {138                     is.close();139                 } catch (IOException e) {140                     e.printStackTrace();141                 }142             }143             if (uRLConnection != null) {144                 uRLConnection.disconnect();145             }146         }147         return result;148     }149 150     private AppVersion parseJson(String json) {151         AppVersion appVersion = new AppVersion();152         try {153             JSONObject obj = new JSONObject(json);154             String updateMessage = obj.getString(AppVersion.APK_UPDATE_CONTENT);155             String apkUrl = obj.getString(AppVersion.APK_DOWNLOAD_URL);156             int apkCode = obj.getInt(AppVersion.APK_VERSION_CODE);157             System.out.println("updateMessage-->" + updateMessage158                     + " apkUrl-->>" + apkUrl + "  apkCode-->>" + apkCode);159             appVersion.setApkCode(apkCode);160             appVersion.setApkUrl(apkUrl);161             appVersion.setUpdateMessage(updateMessage);162         } catch (JSONException e) {163             Log.e(TAG, "parse json error", e);164         }165         return appVersion;166     }167 168     public void showUpdateDialog() {169         AlertDialog.Builder builder = new AlertDialog.Builder(mContext);170         // builder.setIcon(R.drawable.icon);171         builder.setTitle("有新版本");172         builder.setMessage(mAppVersion.getUpdateMessage());173         builder.setPositiveButton("下载", new DialogInterface.OnClickListener() {174             public void onClick(DialogInterface dialog, int whichButton) {175                 downLoadApk();176             }177         });178         builder.setNegativeButton("忽略", new DialogInterface.OnClickListener() {179             public void onClick(DialogInterface dialog, int whichButton) {180 181             }182         });183         builder.show();184     }185 186     public void downLoadApk() {187         String apkUrl = mAppVersion.getApkUrl();188         System.out.println("apkUrl-->>" + apkUrl);189         String dir = mContext.getExternalFilesDir("apk").getAbsolutePath();190         File folder = Environment.getExternalStoragePublicDirectory(dir);191         if (folder.exists() && folder.isDirectory()) {192             // do nothing193         } else {194             folder.mkdirs();195         }196         String filename = apkUrl.substring(apkUrl.lastIndexOf("/"),197                 apkUrl.length());198         String destinationFilePath = dir + "/" + filename;199         apkFile = new File(destinationFilePath);200         mProgressDialog.show();201         Intent intent = new Intent(mContext, DownloadService.class);202         intent.putExtra("url", apkUrl);203         intent.putExtra("dest", destinationFilePath);204         intent.putExtra("receiver", new DownloadReceiver(new Handler()));205         mContext.startService(intent);206     }207 208     private class DownloadReceiver extends ResultReceiver {209         public DownloadReceiver(Handler handler) {210             super(handler);211         }212 213         @Override214         protected void onReceiveResult(int resultCode, Bundle resultData) {215             super.onReceiveResult(resultCode, resultData);216             if (resultCode == DownloadService.UPDATE_PROGRESS) {217                 int progress = resultData.getInt("progress");218                 mProgressDialog.setProgress(progress);219                 if (progress == 100) {220                     mProgressDialog.dismiss();221                     // 如果没有设置SDCard写权限,或者没有sdcard,apk文件保存在内存中,需要授予权限才能安装222                     String[] command = { "chmod", "777", apkFile.toString() };223                     try {224                         ProcessBuilder builder = new ProcessBuilder(command);225                         builder.start();226                         Intent intent = new Intent(Intent.ACTION_VIEW);227                         intent.setDataAndType(Uri.fromFile(apkFile),228                                 "application/vnd.android.package-archive");229                         mContext.startActivity(intent);230                     } catch (Exception e) {231 232                     }233                 }234             }235         }236     }237 }

MainActivity:

 1 public class MainActivity extends Activity { 2     UpdateChecker update; 3     @Override 4     protected void onCreate(Bundle savedInstanceState) { 5         super.onCreate(savedInstanceState); 6         setContentView(R.layout.activity_main); 7         update = new UpdateChecker(MainActivity.this); 8         findViewById(R.id.btn).setOnClickListener(new OnClickListener() { 9 10             @Override11             public void onClick(View v) {12                 update.setCheckUrl("http://jcodecraeer.com/update.php");13                 update.checkForUpdates();14             }15         });16     }17 18 }

 

源码下载:下载

 

Android 应用检查更新并下载