Android簡單實現(xiàn)文件下載
本文實例為大家分享了Android簡單實現(xiàn)文件下載的具體代碼,供大家參考,具體內(nèi)容如下
權(quán)限
<!-- 文件讀寫權(quán)限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 訪問內(nèi)存 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
DownloadOkHttp 使用(無顯示)
下載完成地址: /storage/emulated/0/小紅書/xiaohongshu.apk
DownloadUtil.DownloadOkHttp.get().download(apk, Environment.getExternalStorageDirectory() + "/" + "小紅書", new DownloadUtil.DownloadOkHttp.OnDownloadListener() { @Override public void onDownloadSuccess() { Log.e("下載","成功"); } @Override public void onDownloading(int progress) { Log.e("下載", String.valueOf(progress)); } @Override public void onDownloadFailed() { Log.e("下載","失敗"); } });
Download 使用(有顯示)
下載完成地址: /小紅書/小紅書.apk
new DownloadUtil.Download(this, apk, "小紅書.apk", "小紅書");
dialog_progress
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/dp_20" android:orientation="vertical"> <ProgressBar android:id="@+id/id_progress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/id_text" android:layout_width="match_parent" android:layout_marginTop="10dp" android:gravity="right" android:text="0 %" android:layout_height="wrap_content"/> </LinearLayout>
**工具類DownloadUtil(兩個實現(xiàn)方法,自己悟?。。。?/p>
package com.simon.util; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import com.simon.app.R; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import androidx.annotation.NonNull; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; /** * 創(chuàng)建者: Simon * 創(chuàng)建時間:2021/6/7 13:58 * 描述:文件下載 */ public class DownloadUtil { public static class DownloadOkHttp { private static DownloadOkHttp downloadUtil; private final OkHttpClient okHttpClient; public static DownloadOkHttp get() { if (downloadUtil == null) { downloadUtil = new DownloadOkHttp(); } return downloadUtil; } private DownloadOkHttp() { okHttpClient = new OkHttpClient(); } /** * * @param url 下載連接 * @param saveDir 儲存下載文件的SDCard目錄 * @param listener 下載監(jiān)聽 */ public void download( String url, final String saveDir, final OnDownloadListener listener) { Request request = new Request.Builder().url(url).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 下載失敗 listener.onDownloadFailed(); } @Override public void onResponse(Call call, Response response) throws IOException { InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null; // 儲存下載文件的目錄 String savePath = isExistDir(saveDir); try { is = response.body().byteStream(); long total = response.body().contentLength(); File file = new File(savePath, getNameFromUrl(url)); fos = new FileOutputStream(file); long sum = 0; while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); sum += len; int progress = (int) (sum * 1.0f / total * 100); // 下載中 listener.onDownloading(progress); } fos.flush(); // 下載完成 listener.onDownloadSuccess(); } catch (Exception e) { listener.onDownloadFailed(); } finally { try { if (is != null) is.close(); } catch (IOException e) { } try { if (fos != null) fos.close(); } catch (IOException e) { } } } }); } /** * 判斷下載目錄是否存在 * @param saveDir * @return * @throws IOException */ private String isExistDir(String saveDir) throws IOException { // 下載位置 File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir); if (!downloadFile.mkdirs()) { downloadFile.createNewFile(); } String savePath = downloadFile.getAbsolutePath(); return savePath; } /** * url * 從下載連接中解析出文件名 */ @NonNull public static String getNameFromUrl(String url) { return url.substring(url.lastIndexOf("/") + 1); } public interface OnDownloadListener { /** * 下載成功 */ void onDownloadSuccess(); /** * @param progress * 下載進度 */ void onDownloading(int progress); /** * 下載失敗 */ void onDownloadFailed(); } } public static class Download { private String fileSavePath = "";//保存文件的本地路徑 private String fileDownLoad_path = "";//下載的URL private String mfileName = "";//下載的文件名字 private boolean mIsCancel = false; private int mProgress; private ProgressBar mProgressBar; private TextView text; private Dialog mDownloadDialog; private final Context context; private static final int DOWNLOADING = 1; private static final int DOWNLOAD_FINISH = 2; private Handler mUpdateProgressHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case DOWNLOADING: // 設(shè)置進度條 mProgressBar.setProgress(mProgress); text.setText(String.valueOf(mProgress)); break; case DOWNLOAD_FINISH: // 隱藏當前下載對話框 mDownloadDialog.dismiss(); } } }; /** * 下載初始化 * @param context 上下文 * @param fileDownLoad_path 下載的URL * @param mfileName 下載的文件名字 * @param fileSavePath 保存文件的本地路徑 */ public Download(Context context, String fileDownLoad_path, String mfileName, String fileSavePath) { this.context = context; this.fileDownLoad_path = fileDownLoad_path; this.mfileName = mfileName; this.fileSavePath = Environment.getExternalStorageDirectory() + "/" + fileSavePath; showDownloadDialog(); } /** * 顯示正在下載的對話框 */ protected void showDownloadDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("下載中"); View view = LayoutInflater.from(context).inflate(R.layout.dialog_progress, null); mProgressBar = (ProgressBar) view.findViewById(R.id.id_progress); text = view.findViewById(R.id.id_text); builder.setView(view); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 隱藏當前對話框 dialog.dismiss(); // 設(shè)置下載狀態(tài)為取消 mIsCancel = true; } }); mDownloadDialog = builder.create(); mDownloadDialog.show(); // 下載文件 downloadFile(); } /** * 下載文件 */ private void downloadFile() { new Thread(new Runnable() { @Override public void run() { try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File dir = new File(fileSavePath); if (!dir.exists()){ dir.mkdirs(); } // 下載文件 HttpURLConnection conn = (HttpURLConnection) new URL(fileDownLoad_path).openConnection(); conn.connect(); InputStream is = conn.getInputStream(); int length = conn.getContentLength(); File apkFile = new File(fileSavePath, mfileName); FileOutputStream fos = new FileOutputStream(apkFile); int count = 0; byte[] buffer = new byte[1024]; while (!mIsCancel) { int numread = is.read(buffer); count += numread; // 計算進度條當前位置 mProgress = (int) (((float) count / length) * 100); // 更新進度條 mUpdateProgressHandler.sendEmptyMessage(DOWNLOADING); // 下載完成 if (numread < 0) { mUpdateProgressHandler.sendEmptyMessage(DOWNLOAD_FINISH); break; } fos.write(buffer, 0, numread); } fos.close(); is.close(); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android通過jxl讀excel存入sqlite3數(shù)據(jù)庫
本文主要介紹了android通過jxl去讀excel的內(nèi)容,然后存入sqlite3數(shù)據(jù)庫表,需要用到j(luò)xl的jar包和sqlite 的jar包,圖片是excel的數(shù)據(jù)格式,需要的朋友可以參考下2014-03-03Android13?加強Intent?filters?的安全性
這篇文章主要介紹了Android13?加強Intent?filters?的安全性,文章基于Android13?展開Intent?filters?安全性加強的詳細介紹,需要的小伙伴可以參考一下2022-05-05Android 勇闖高階性能優(yōu)化之啟動優(yōu)化篇
在移動端程序中,用戶希望的是應(yīng)用能夠快速打開。啟動時間過長的應(yīng)用不能滿足這個期望,并且可能會令用戶失望。輕則鄙視你,重則直接卸載你的應(yīng)用2021-10-10android-使用環(huán)信SDK開發(fā)即時通信功能(附源碼下載)
本篇文章主要介紹了android-使用環(huán)信SDK開發(fā)即時通信功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。2016-12-12Android中判斷網(wǎng)絡(luò)是否連接實例詳解
這篇文章主要介紹了Android中判斷網(wǎng)絡(luò)是否連接實例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01Android使用Volley框架定制PostUploadRequest上傳文件
這篇文章主要為大家詳細介紹了Android使用Volley框架定制PostUploadRequest上傳文件或圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12