功能描述:
1.下载远程服务器端的apk文件
2.同步显示下载进度
3.下载完成自动安装
关键技术点:
主要分为三个步骤:1.sd卡文件读写
2.ProgressDialog的使用
3.分线程请求网络
4.安装apk
首先将要安装的apk进行打包,并将其放在一个先建的web工程下,然后写一个布局文件,只需要有一个简单的按钮即可,可在按钮上设置监听事件,按着上面的步骤进行操作1.主线程,显示提示视图:ProgressDialog
2.启动分线程,请求下载apk文件,下载过程中显示下载进度
3.主线程,移除dialog,启动安装
第一步:
1.显示提示视图:ProgressDialog其为水平进度
2.准备用于保存APK文件的File对象
第二步:
1.启动分线程,请求下载apk文件,下载过程中显示下载进度
2.使用HTTPUrlConnection得到请求连接对象,设置,连接,得到请求响应码
3.设置Dialog的最大进度
4.得到包含apk文件数据的InputStream
5.创建指向apkFile的FileoutputStream
6.边读边写,显示进度下载,休息一会
7.关闭流,关闭连接
第三步:
1.移除dialog
设置保存文件的File对象2.启动安装
button的点击事件private File apkFile;
启动下载public void download (View v) { //1.主线程,显示提示视图:ProgressDialog final ProgressDialog dialog = new ProgressDialog(this); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.show(); //准备用于保存APK文件的File对象 apkFile = new File(getExternalFilesDir(null),"net.apk"); //2.启动分线程,请求下载APK文件,下载过程中显示下载进度 new Thread(new Runnable() { @Override public void run() { try { //得到连接对象 String path = "http://192.168.51.5:8080/web_server/app-release.apk"; URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //设置 connection.setRequestMethod("GET"); connection.setReadTimeout(10000); connection.setConnectTimeout(5000); //连接 connection.connect(); //请求并得到响应码200 int responseCode = connection.getResponseCode(); if (responseCode==200) { //设置Dialog的最大进度 dialog.setMax(connection.getContentLength()); //得到包含APK文件数据的InputStream InputStream is = connection.getInputStream(); //创建指向apkFile的FileoutputStream FileOutputStream fos = new FileOutputStream(apkFile); //边读边写 byte [] buffer = new byte[1024]; int len =-1; while ((len=is.read(buffer))!=-1) { fos.write(buffer,0,len); //显示进度下载 dialog.incrementProgressBy(len); //休息一会(模拟网速慢) // Thread.sleep(50); SystemClock.sleep(50);//与上面相比这个不需要抛异常 } fos.close(); is.close(); } //下载完成 connection.disconnect(); //3.主线程,移除dialog,启动安装 runOnUiThread(new Runnable() { @Override public void run() { dialog.dismiss(); install(); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }
private void install() { Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE"); intent.setDataAndType(Uri.fromFile(apkFile),"application/vnd.android.package-archive"); startActivity(intent); }
权限设置,主要需要两个权限,联网权限和保存文件在sd时的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>