android中apk的下载与自动安装方法介绍

手机中文件的下载分为后台自动下载和前台下载,我总结了这两种下的实现代码,其中前台下载并实现下载进度条的实现。

第一种:后台下载

/**
 * 后台在下面一个Apk 下载完成后返回下载好的文件
 *
 * @param httpUrl
 * @return
 */
 private File downFile(final String httpUrl) {

 new Thread(new Runnable() {

 @Override
 public void run() {
 try {
 URL url = new URL(httpUrl);
 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 connection.setRequestMethod("GET");
 connection.setConnectTimeout(5000);
 FileOutputStream fileOutputStream = null;
 InputStream inputStream;
 if (connection.getResponseCode() == 200) {
 inputStream = connection.getInputStream();

 if (inputStream != null) {
 file = getFile(httpUrl);
 fileOutputStream = new FileOutputStream(file);
 byte[] buffer = new byte[1024];
 int length = 0;

 while ((length = inputStream.read(buffer)) != -1) {
 fileOutputStream.write(buffer, 0, length);
 }
 fileOutputStream.close();
 fileOutputStream.flush();
 }
 inputStream.close();
 }
 //下载完成
 //安装
 installApk();
 } catch (MalformedURLException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }).start();
 return file;
 }

 /**
 * 根据传过来url创建文件
 *
 */
 private File getFile(String url) {
 File files = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), getFilePath(url));
 return files;
 }

 /**
 * 截取出url后面的apk的文件名
 *
 * @param url
 * @return
 */
 private String getFilePath(String url) {
 return url.substring(url.lastIndexOf("/"), url.length());
 }

 /**
 * 安装APK
 */
 private void installApk() {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
 startActivity(intent);
 }

 

第二种

//下载apk程序代码
 protected File downLoadFile(String httpUrl) {
                 // TODO Auto-generated method stub
                 final String fileName = "updata.apk";
                 File tmpFile = new File("/sdcard/update");
                 if (!tmpFile.exists()) {
                         tmpFile.mkdir();
                 }
                 final File file = new File("/sdcard/update/" + fileName);
 
                try {
                         URL url = new URL(httpUrl);
                         try {
                                 HttpURLConnection conn = (HttpURLConnection) url
                                                 .openConnection();
                                 InputStream is = conn.getInputStream();
                                 FileOutputStream fos = new FileOutputStream(file);
                                 byte[] buf = new byte[256];
                                 conn.connect();
                                 double count = 0;
                                 if (conn.getResponseCode() >= 400) {
                                         Toast.makeText(Main.this, "连接超时", Toast.LENGTH_SHORT)
                                                         .show();
                                 } else {
                                         while (count <= 100) {
                                                 if (is != null) {
                                                         int numRead = is.read(buf);
                                                         if (numRead <= 0) {
                                                                 break;
                                                         } else {
                                                                 fos.write(buf, 0, numRead);
                                                         }
 
                                                } else {
                                                         break;
                                                 }
 
                                        }
                                 }
 
                                conn.disconnect();
                                 fos.close();
                                 is.close();
                         } catch (IOException e) {
                                 // TODO Auto-generated catch block
 
                                e.printStackTrace();
                         }
                 } catch (MalformedURLException e) {
                         // TODO Auto-generated catch block
 
                        e.printStackTrace();
                 }
 
                return file;
         }
 //打开APK程序代码
 
private void openFile(File file) {
                 // TODO Auto-generated method stub
                 Log.e("OpenFile", file.getName());
                 Intent intent = new Intent();
                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                 intent.setAction(android.content.Intent.ACTION_VIEW);
                 intent.setDataAndType(Uri.fromFile(file),
                                 "application/vnd.android.package-archive");
                 startActivity(intent);
}

上面这种方式直接调用downFile方法,参数传个URL地址就可以了

第三种:

private String url="http://----------------------.apk";
 private File file;
 private ProgressBar pb;
 private TextView tv;
 private int fileSize;
 private int downLoadFileSize;
 private String filename;
 private Handler handler = new Handler() {
 @Override
 public void handleMessage(Message msg) {//定义一个Handler,用于处理下载线程与UI间通讯
 if (!Thread.currentThread().isInterrupted()) {
 switch (msg.what) {
 case 0:
 pb.setMax(fileSize);
 case 1:
 pb.setProgress(downLoadFileSize);
 int result = downLoadFileSize * 100 / fileSize;
 tv.setText(result + "%");
 break;
 case 2:
 finish();
 openFile(file);
 break;
 case -1:
 String error = msg.getData().getString("error");
 Toast.makeText(DownLoadActivity.this, error, Toast.LENGTH_SHORT).show();
 break;
 }
 }
 super.handleMessage(msg);
 }
 };
new Thread() {
 public void run() {
 try {
 down_file(url, "/sdcard/");
 //下载文件,参数:第一个URL,第二个存放路径
 } catch (ClientProtocolException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }
 }.start();
public void down_file(String url, String path) throws IOException {//下载函数
 filename = url.substring(url.lastIndexOf("/") + 1);//获取文件名
 URL myURL = new URL(url);
 URLConnection conn = myURL.openConnection();
 conn.connect();
 InputStream is = conn.getInputStream();
 this.fileSize = conn.getContentLength();//根据响应获取文件大小
 if (this.fileSize <= 0) throw new RuntimeException("无法获知文件大小 ");
 if (is == null) throw new RuntimeException("stream is null");
 FileOutputStream fos = new FileOutputStream(path + filename);//把数据存入路径+文件名

 byte buf[] = new byte[1024];
 downLoadFileSize = 0;
 sendMsg(0);
 do {
 //循环读取
 int numread = is.read(buf);
 if (numread == -1) {
 break;
 }
 fos.write(buf, 0, numread);
 downLoadFileSize += numread;
 sendMsg(1);//更新进度条
 } while (true);
 file = new File(path + filename);
 sendMsg(2);//通知下载完成
 try {
 is.close();
 } catch (Exception ex) {
 Log.e("tag", "error: " + ex.getMessage(), ex);
 }
 }

 private void sendMsg(int flag) {
 Message msg = new Message();
 msg.what = flag;
 handler.sendMessage(msg);
 }
 //打开APK程序代码

 private void openFile(File file) {
 // TODO Auto-generated method stub
 Log.e("OpenFile", file.getName());
 Intent intent = new Intent();
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 intent.setAction(android.content.Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(file),
 "application/vnd.android.package-archive");
 startActivity(intent);
 }

时间: 2024-11-08 21:23:36

android中apk的下载与自动安装方法介绍的相关文章

Android 的apk重新打包签名后,安装成功后,手机中转屏(横竖屏切换)软件强行自动关闭了

问题描述 Android 的apk重新打包签名后,安装成功后,手机中转屏(横竖屏切换)软件强行自动关闭了 Android 的apk重新打包.签名后,安装成功后,手机中转屏(横竖屏切换)软件强行自动关闭了什么情况,我用apktool打包签名的. 解决方案 最好是接上调试,看看出错时的 logcat 的输出.如果是所有手机都出错,还比较好解决的,就怕重现不了. 解决方案二: 这种情况应该是不支持或不兼容. 解决方案三: activity在转屏的时候会执行onResume(),你可能是有一些变量在转屏

android 中APK如何获取root权限?

问题描述 android 中APK如何获取root权限? android APK中如何获取到root权限,从而能切换到执行诸如exec = Runtime.getRuntime().exec(""su -c ""+abspath); 语句?eng版本 具有root权限吗?可是执行时报错:su: uid xxx not allowed to su adb root 和system root有区别吗? user版本如何仅在开发的APK中获取root权限?user版本在我

android系统下的下载管理程序自动退出是什么原因!求解

问题描述 android系统下的下载管理程序自动退出是什么原因!求解 我用downloadmanager下载东西,但是东西还没有下完,那个在通知栏的东西就自己退出了. 解决方案 换一个手机试试,可能是内存不足下载管理器被kill掉了

Android中gson、jsonobject解析JSON的方法详解_Android

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, ke

Android中gson、jsonobject解析JSON的方法详解

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, ke

Android中正确使用字体图标(iconfont)的方法_Android

字体图标 字体图标是指将图标做成字体文件(.ttf),从而代替传统的png等图标资源. 使用字体图标的优点和缺点分别为: 优点:       1. 可以高度自定义图标的样式(包括大小和颜色),对于个人开发者尤其适用       2. 可以减少项目和安装包的大小(特别你的项目中有很多图片icon时,效果将是M级)       3. 几乎可以忽略屏幕大小和分辨率,做到更好的适配       4. 使用简单       -- 缺点:        1. 只能是一些简单的icon,不能代替如背景图.9图

Android中ListView下拉刷新的实现方法实例分析_Android

本文实例讲述了Android中ListView下拉刷新的实现方法.分享给大家供大家参考,具体如下: ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: package net.loonggg.listview; import java.util.Date; import android.content.Context; import android.util.

Android 中 退出多个activity的经典方法_Android

1.使用List集合方式 用list保存activity实例,然后逐一干掉 import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.DialogInterface; import android.content.Inte

Android中new Notification创建实例的最佳方法_Android

目前 Android 已经不推荐使用下列方式创建 Notification实例: Notification notification = new Notification(R.drawable.ic_launcher,"This is ticker text",System.currentTimeMillis()); 最好采用下列方式: Notification notification = new Notification.Builder(this) .setContentTitle