Android簡單實現文件下載
本文實例為大傢分享瞭Android簡單實現文件下載的具體代碼,供大傢參考,具體內容如下
權限
<!-- 文件讀寫權限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 訪問內存 --> <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(兩個實現方法,自己悟!!!)
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; /** * 創建者: Simon * 創建時間: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 下載監聽 */ 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: // 設置進度條 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(); // 設置下載狀態為取消 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(); } } }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- android實現動態顯示隱藏進度條
- android實現動態顯隱進度條
- Android應用實現點擊按鈕震動
- Android ProgressBar 模擬進度條效果的實現
- Android基於OkHttp實現文件上傳功能