Android 断点下载和自动安装的示例代码

今天说一下Android中下载App到手机中并自动安装,啥也不说了先上效果图了!

上面呢是下载中的一个图片和下载后会自动提示你安装的一个图片,二话不说,这接开代码吧!

首先来一个下布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="zhangtao.bwie.com.continutransform.MainActivity">
  <ProgressBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/progress"
    style="?android:attr/progressBarStyleHorizontal"
    android:max="100"
    />
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:textSize="22sp"
    android:text=""
    android:id="@+id/pro_text"
    android:layout_below="@id/progress"
    />
  <Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/start_btn"
    android:text="开始下载"
    android:layout_below="@id/pro_text"
    />
  <Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/stop_btn"
    android:text="停止下载"
    android:layout_below="@id/start_btn"
    />
</RelativeLayout>

布局随便写了,只要是你想要的布局

然后我么来一个接口,用来帮助我么将要写的下载工具类传输数据的:

package Download;
public interface DownloadListener {
  void startDownload();
  void stopDownload();
  void finishDownload();
  void downloadProgress(long progress);
} 

这个接口写了4个接口方法,分别是开始下载、停止下载、完成下载以及下载是的进度。

接下来就是写下载工具类了,下载呢就使用OkHttp进行请求网络数据了,这里把这个工具类写成单利模式,方便使用!

package Download;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class DownloadUtils {
  private static volatile DownloadUtils instance;
  private final OkHttpClient client;
  private DownloadListener mlistener;
  private File file;
  private String fileAbsolutePath;
  public File downloadFile;
  private long startPosition;
  private Call call; 

  public DownloadUtils() {
    client = new OkHttpClient();
  }
  public void setListener(DownloadListener listener) {
    this.mlistener = listener;
  } 

  /**
   * 初始化下载父路径
   * @return
   */
  public void initDownload(String path) {
    file = new File(path);
    if(!file.getParentFile().exists()) {
      file.getParentFile().mkdir();
    }
    if(!file.exists()) {
      try {
        file.createNewFile();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    fileAbsolutePath = file.getAbsolutePath();
    Log.d("zzz",fileAbsolutePath.toString());
  }
  public static DownloadUtils getInstance() {
    if(instance == null) {
      synchronized (DownloadUtils.class) {
        if(instance == null) {
          instance = new DownloadUtils();
        }
      }
    }
      return instance;
  }
  public void startDownload(String url) {
    if(TextUtils.isEmpty(url)) {
      return ;
    }
    if(url.contains(".")) {
      String typename = url.substring(url.lastIndexOf(".") + 1);
      if(url.contains("/")) {
        String filename = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
        String fn = filename+"."+typename;
        downloadFile = new File(this.file, fn);
        Log.d("zzz","downloadFile"+downloadFile.toString());
      }
    }
    startPosition = 0;
    if(downloadFile.exists()) {
      startPosition = downloadFile.length();
    }
    final Request request = new Request.Builder()
        .addHeader("RANGE","bytes="+startPosition+"-")
        .url(url)
        .build();
    call = client.newCall(request);
    call.enqueue(new Callback() {
      @Override
      public void onFailure(Call call, IOException e) { 

      }
      @Override
      public void onResponse(Call call, Response response) throws IOException {
        mlistener.startDownload();
        ResponseBody body = response.body();
//        startPosition
        long totalLength = body.contentLength() ;
        Log.d("zzz", "totalLength: " + totalLength + "----");
        InputStream is = body.byteStream();
        byte[] bytes = new byte[2048];
        int len = 0;
        long totalNum = startPosition;
        RandomAccessFile raf = new RandomAccessFile(downloadFile, "rw");
        while ((len = is.read(bytes,0,bytes.length)) != -1) {
          raf.seek(totalNum);
          raf.write(bytes,0,len);
          totalNum +=len;
          mlistener.downloadProgress(totalNum * 100 / totalLength); 

        }
         mlistener.finishDownload();
         body.close();
      }
    });
  }
  public void stopDownload() {
    mlistener.startDownload();
    if(call != null && call.isExecuted()) {
      call.cancel();
    }
  }
}

这里做断点下载是使用了RandomAccessFile,大家可以网上去了解一下RandomAccessFile的作用。

下面是主界面的功能实现和调用,基本就是些获取控件和调用刚才写好的工具类:

package zhangtao.bwie.com.continutransform;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.File;
import Download.DownloadListener;
import Download.DownloadUtils;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  private TextView pro_text;
  private Button start_btn;
  private Button stop_btn;
  private String downloadUrl = "http://d.988wan.com/zft/qmzft32_988wan_01.apk";
  private String path = "/ZhangTao/";
  private ProgressBar pro_bar;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    setOnClick();
    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
      File storageDirectory = Environment.getExternalStorageDirectory();
      final String absolutePath = storageDirectory.getAbsolutePath();
      path = absolutePath + path;
      DownloadUtils.getInstance().initDownload(path);
      DownloadUtils.getInstance().setListener(new DownloadListener() {
        @Override
        public void startDownload() { 

        }
        @Override
        public void stopDownload() {
        }
        @Override
        public void finishDownload() {
          File downloadFile = DownloadUtils.getInstance().downloadFile;
          installApk(downloadFile);
        }
        @Override
        public void downloadProgress(final long progress) {
          runOnUiThread(new Runnable() {
            @Override
            public void run() {
              pro_bar.setProgress((int) progress);
              pro_text.setText(progress+"%");
            }
          });
        }
      });
    }
  } 

  private void initView() {
    pro_text = (TextView) findViewById(R.id.pro_text);
    start_btn = (Button) findViewById(R.id.start_btn);
    stop_btn = (Button) findViewById(R.id.stop_btn);
    pro_bar = (ProgressBar) findViewById(R.id.progress);
  }
  private void setOnClick() {
    start_btn.setOnClickListener(this);
    stop_btn.setOnClickListener(this);
  }
  @Override
  public void onClick(View view) {
    switch (view.getId()) {
      case R.id.start_btn:
        DownloadUtils.getInstance().startDownload(downloadUrl);
        break;
      case R.id.stop_btn:
        DownloadUtils.getInstance().stopDownload();
        break;
    }
  }
  /**
   * 安装apk
   * @param file
   */
  private void installApk(File file) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
    startActivity(intent);
    android.os.Process.killProcess(android.os.Process.myPid());
  }
} 

上面的自动安装是installApk这个方法,这个没必要去了解太多,都是Android的一个固定方法,一般网上都会有的,希望可以帮到大家!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • android多线程断点下载-带进度条和百分比进度显示效果
  • Android HttpURLConnection断点下载(单线程)
  • Android原生实现多线程断点下载实例代码
  • 详解Android中的多线程断点下载
  • Android入门:多线程断点下载详细介绍
  • Android使用多线程实现断点下载
  • Android实现断点下载的方法
  • Android实现多线程断点下载的方法
  • android自动安装apk代码实例(不使用apk安装器安装)
(0)

相关推荐

  • Android使用多线程实现断点下载

    多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务..可以使任务的执行速度变快..多线程的任务下载时常都会使用得到..比如说我们手机内部应用宝的下载机制..一定是通过使用了多线程创建的下载器..并且这个下载器可以实现断点下载..在任务被强行终止之后..下次可以通过触发按钮来完成断点下载...那么如何实现断点下载这就是一个问题了.. 首先我们需要明确一点就是多线程下载器通过使用多个线程对同一个任务进行下载..但是这个多线程并不是线程的数目越多,下载的速度就越快..当线程增加的很多的

  • Android实现多线程断点下载的方法

    本文实例讲述了Android实现多线程断点下载的方法.分享给大家供大家参考.具体实现方法如下: package cn.itcast.download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt

  • 详解Android中的多线程断点下载

    首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就构 成了完整的文件了.这样就大大提高了文件的下载效率.对于文件下载来说,多线程下载是必须要考虑的环节. 多线程下载大致可分为以下几个步骤: 一.获取服务器上的目标文件的大小 显然这一步是需要先访问一下网络,只需要获取到目标文件的总大小即可.目的是为了计算每个线程应该分配的下载任务. 二. 在本地创建一个跟原始

  • Android原生实现多线程断点下载实例代码

    各位父老乡亲,我单汉三又回来了,今天为大家带来一个用原生的安卓写的多线程断点下载Demo. 通过本文你可以学习到: SQLite的基本使用,数据库的增删改查. Handler的消息处理与更新UI. Service(主要用于下载)的进阶与使用. 原生的json文件解析(多层嵌套). RandomAccessFile的基本使用,可以将文件分段. 基于HttpURLConnection的大文件下载. 上面内容结合,实现多线程,断点下载. Demo是在TV上运行的,图片显示的问题不要纠结了. 文件下载的

  • android自动安装apk代码实例(不使用apk安装器安装)

    复制代码 代码如下: /**     * 安装下载完成的APK     * @param savedFile     */    private void installAPK(File savedFile) {        //调用系统的安装方法        Intent intent=new Intent();        intent.setAction(intent.ACTION_VIEW);        intent.setDataAndType(Uri.fromFile(sa

  • Android HttpURLConnection断点下载(单线程)

    HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类: Android 6.0之后取消了HttpClient,不支持跟新 ,今天小编使用的是HttpURLConnection : 直接上代码: URL url = null; BufferedInputStream bin = null; HttpURLConnection httpURLConnection = null; Context context; try { //你要下载文件的路径 Str

  • Android入门:多线程断点下载详细介绍

    本案例在于实现文件的多线程断点下载,即文件在下载一部分中断后,可继续接着已有进度下载,并通过进度条显示进度.也就是说在文件开始下载的同时,自动创建每个线程的下载进度的本地文件,下载中断后,重新进入应用点击下载,程序检查有没有本地文件的存在,若存在,获取本地文件中的下载进度,继续进行下载.当下载完成后,自动删除本地文件. 一.多线程断点下载介绍 所谓的多线程断点下载就是利用多线程下载,并且可被中断,如果突然没电了,重启手机后可以继续下载,而不需要重新下载: 利用的技术有:SQLite存储各个线程的

  • Android实现断点下载的方法

    最近做的项目中需要实现断点下载,即用户一次下载可以分多次进行,下载过程可以中断,在目前大多数的带离线缓存的软件都是需要实现这一功能.本文阐述了通过sqlite3简单实现了一个具有断点下载功能的demo.言归正传,开始正文. 设计 数据库表存储元数据 DBHelper.java 用于业务存储的Dao Dao.java 抽象下载信息的Bean LoadInfo.java 呈现下载信息View MainActivity.java 存储下载信息Bean DownloadInfo.java 封装好的下载类

  • android多线程断点下载-带进度条和百分比进度显示效果

    android多线程断点下载,带进度条和百分比显示,断点下载的临时数据保存到SD卡的文本文档中,建议可以保存到本地数据库中,这样可以提高存取效率,从而提高系统性能. 效果: 打开软件: 下载中: 下载完毕: 附代码如下: package com.yy.multiDownloadOfBreakPoint; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.R

  • Android 断点下载和自动安装的示例代码

    今天说一下Android中下载App到手机中并自动安装,啥也不说了先上效果图了! 上面呢是下载中的一个图片和下载后会自动提示你安装的一个图片,二话不说,这接开代码吧! 首先来一个下布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap

  • python+selenium小米商城红米K40手机自动抢购的示例代码

    使用环境 1.python3 2.selenium selenium使用简述 1.安装selenium pip install selenium 2.安装ChromeDriver 下载地址:http://chromedriver.storage.googleapis.com/index.html 注意:下载的ChromeDriver需要与Chrome版本一致. 1)Chrome版本查看: 2)ChromeDriver对应版本下载: 3)ChromeDriver下载后解压到任意文件夹,建议可以放到

  • Android中js和原生交互的示例代码

    本文介绍了Android中js和原生交互的示例代码,分享给大家,具体如下: 加载webview的类 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); JavaScriptInterf

  • Android 实现无网络传输文件的示例代码

    最近的项目需要实现一个 Android 手机之间无网络传输文件的功能,就发现了 Wifi P2P(Wifi点对点)这么一个功能,最后也实现了通过 Wifi 隔空传输文件 的功能,这里我也来整理下代码,分享给大家. Wifi P2P 是在 Android 4.0 以及更高版本系统中加入的功能,通过 Wifi P2P 可以在不连接网络的情况下,直接与配对的设备进行数据交换.相对于蓝牙,Wifi P2P 的搜索速度和传输速度更快,传输距离更远 实现的效果如下所示: 客户端.png 服务器端.png 一

  • 用python-webdriver实现自动填表的示例代码

    在日常工作中常常需要重复填写某些表单,如果人工完成,费时费力,而且网络延迟令人十分崩溃.如果能够用程序实现自动填表,效率可以提高一倍以上,并且能够移植到多台计算机,进一步提高工作效率.webdriver是python的selenium库中的一个自动化测试工具,它能完全模拟浏览器的操作,无需处理复杂的request.post,对爬虫初学者十分友好. 一.环境配置 python3.6+selenium库+xlrd库+xlwt库 其中xlrd和xlwt库用于读写excel表中的数据. 还要下载一个浏览

  • Android利用贝塞尔曲线绘制动画的示例代码

    目录 彩虹系列 弹簧动画 复杂立体感动画 总结 前面我们花了几篇介绍了贝塞尔曲线的原理和绘制贝塞尔曲线,着实让我们见识到了贝塞尔曲线的美.好奇心驱使我想看看贝塞尔曲线动起来会是什么样?本篇就借由动画驱动贝塞尔曲线绘制看看动起来的贝塞尔曲线什么效果. 彩虹系列 通过动画控制绘制的结束点,就可以让贝塞尔曲线动起来.例如下面的动图展示的效果,看起来像搭了一个滑滑梯一样.实际上就是用7条贝塞尔曲线实现的,我们使用了 Animation 对象的值来控制绘制的结束点,从而实现了对应的动画效果. 具体源码如下

  • Android利用Flutter path绘制粽子的示例代码

    目录 前言 绘制 基本轮廓 粽叶 嘴巴 眼睛 腮红 手&脚 头巾 咸甜是一家 发声 动画控制嘴巴开合 用到的技术点 总结 前言 大家好,端午将至,首先提前祝小伙伴端午安康,端午作为中华民族的非常重要的传统节日,粽子那是必不可少的,但是你真的知道粽子的历史吗? 今天跟随本篇文章用Flutter path画一个会科普节日的的粽子吧- 绘制 基本轮廓 首先我们需要将粽子的基本轮廓绘制出来,通过图片可以看到粽子的轮廓是一个圆圆的三角形状, 本篇文章所有的图形都是用纯Path路径制作,这里我们可以将粽子的

  • Android串口通信封装之OkUSB的示例代码

    本文介绍了Android串口通信封装之OkUSB的示例代码,分享给大家.具体如下: Github传送门:OkUSB OkUSB 一个简洁的Android串口通信框架. 功能简介 支持设置波特率 支持设置数据位 支持设置停止位 支持设置校验位 支持DTS和RTS 支持串口连接状态监听 用法简介 Gradle allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile '

  • Android 实现无网络页面切换的示例代码

    本文介绍了Android 实现无网络页面切换的示例代码,分享给大家,具体如下: 实现思路 需求是在无网络的时候显示特定的页面,想到要替换页面的地方,大多都是recyclerview或者第三方recyclerview这种需要显示数据的地方,因此决定替换掉页面中所有的recyclerview为无网络页面 实现过程 1 在BaseActivity中,当加载布局成功以后,通过id找到要替换的view,通过indexOfChild()方法,找到要替换的view的位置,再通过remove和add view来

  • Android ItemDecoration 实现分组索引列表的示例代码

    本文介绍了Android ItemDecoration 实现分组索引列表的示例代码,分享给大家.具体如下: 先来看看效果: 我们要实现的效果主要涉及三个部分: 分组 GroupHeader 分割线 SideBar 前两个部分涉及到一个ItemDecoration类,也是我们接下来的重点,该类是RecyclerView的一个抽象静态内部类,主要作用就是给RecyclerView的ItemView绘制额外的装饰效果,例如给RecyclerView添加分割线. 使用ItemDecoration时需要继

随机推荐