国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 斷點(diǎn)下載和自動(dòng)安裝的示例代碼

2019-10-22 18:16:46
字體:
供稿:網(wǎng)友

今天說一下Android中下載App到手機(jī)中并自動(dòng)安裝,啥也不說了先上效果圖了!

Android,斷點(diǎn)下載,自動(dòng)安裝

Android,斷點(diǎn)下載,自動(dòng)安裝

上面呢是下載中的一個(gè)圖片和下載后會(huì)自動(dòng)提示你安裝的一個(gè)圖片,二話不說,這接開代碼吧!

首先來一個(gè)下布局:

<?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> 

布局隨便寫了,只要是你想要的布局

然后我么來一個(gè)接口,用來幫助我么將要寫的下載工具類傳輸數(shù)據(jù)的:

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

這個(gè)接口寫了4個(gè)接口方法,分別是開始下載、停止下載、完成下載以及下載是的進(jìn)度。

接下來就是寫下載工具類了,下載呢就使用OkHttp進(jìn)行請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)了,這里把這個(gè)工具類寫成單利模式,方便使用!

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();     }   } } 

這里做斷點(diǎn)下載是使用了RandomAccessFile,大家可以網(wǎng)上去了解一下RandomAccessFile的作用。

下面是主界面的功能實(shí)現(xiàn)和調(diào)用,基本就是些獲取控件和調(diào)用剛才寫好的工具類:

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());   } } 

上面的自動(dòng)安裝是installApk這個(gè)方法,這個(gè)沒必要去了解太多,都是Android的一個(gè)固定方法,一般網(wǎng)上都會(huì)有的,希望可以幫到大家!

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 犍为县| 凯里市| 丰都县| 斗六市| 钟山县| 太谷县| 社会| 花莲市| 柯坪县| 莎车县| 邢台县| 高密市| 平南县| 娱乐| 缙云县| 登封市| 湘阴县| 水富县| 邯郸市| 金平| 阜康市| 陆河县| 施甸县| 信宜市| 卫辉市| 恭城| 方城县| 武山县| 湖南省| 肃南| 多伦县| 佛山市| 兴业县| 广河县| 南安市| 绥芬河市| 武夷山市| 吉水县| 扎兰屯市| 罗江县| 淮安市|