New file |
| | |
| | | package com.okgoincar.utils.download; |
| | | |
| | | import android.app.DownloadManager; |
| | | import android.content.BroadcastReceiver; |
| | | import android.content.Context; |
| | | import android.content.Intent; |
| | | import android.content.IntentFilter; |
| | | import android.database.Cursor; |
| | | import android.net.Uri; |
| | | import android.os.Environment; |
| | | import android.util.Log; |
| | | import android.widget.Toast; |
| | | |
| | | |
| | | /** |
| | | * Created by ts_xiaoA on 2019/12/2 14:35 |
| | | * E-Mail Address:443502578@qq.com |
| | | * Desc: |
| | | */ |
| | | public class DownloadUtil { |
| | | |
| | | //下载器 |
| | | private DownloadManager downloadManager; |
| | | //上下文 |
| | | private Context mContext; |
| | | //下载的ID |
| | | private long downloadId; |
| | | //进度变化监听 |
| | | private OnProgressListener onProgressChanged; |
| | | //下载进度观察者 |
| | | private DownloadObserver downloadObserver; |
| | | |
| | | public DownloadUtil(Context context) { |
| | | this(context, null); |
| | | } |
| | | |
| | | public DownloadUtil(Context mContext, OnProgressListener onChangedCallback) { |
| | | this.mContext = mContext; |
| | | this.onProgressChanged = onChangedCallback; |
| | | } |
| | | |
| | | //下载apk |
| | | public void downloadAPK(String url, String name) { |
| | | //创建下载任务 |
| | | DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); |
| | | //移动网络情况下是否允许漫游 |
| | | request.setAllowedOverRoaming(false); |
| | | |
| | | //在通知栏中显示,默认就是显示的 |
| | | request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); |
| | | request.setTitle(name); |
| | | request.setDescription(name); |
| | | request.setVisibleInDownloadsUi(true); |
| | | //设置下载的路径 |
| | | request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, name); |
| | | |
| | | //获取DownloadManager |
| | | downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); |
| | | //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等 |
| | | downloadId = downloadManager.enqueue(request); |
| | | //注册广播接收者,监听下载状态 |
| | | mContext.registerReceiver(receiver, |
| | | new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); |
| | | //添加监听 |
| | | if (onProgressChanged != null) { |
| | | Uri uriForDownloadedFile = Uri.parse("content://downloads/"); |
| | | downloadObserver = new DownloadObserver(); |
| | | downloadObserver.setOnChangedCallback((selfChange, uri) -> { |
| | | DownloadManager.Query query = new DownloadManager.Query(); |
| | | Cursor cursor = downloadManager.query(query); |
| | | cursor.moveToFirst(); |
| | | int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); |
| | | int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); |
| | | double progress = ((double) bytes_downloaded * 100) / (double) bytes_total; |
| | | Log.i("TAG", "bytes_downloaded: DX"+bytes_downloaded); |
| | | Log.i("TAG", "bytes_total: DX"+bytes_total); |
| | | Log.i("TAG", "progress: DX"+progress); |
| | | cursor.close(); |
| | | onProgressChanged.onProgressChanged((int) progress); |
| | | }); |
| | | mContext.getContentResolver().registerContentObserver(uriForDownloadedFile, true, downloadObserver); |
| | | } |
| | | } |
| | | |
| | | //广播监听下载的各个状态 |
| | | private BroadcastReceiver receiver = new BroadcastReceiver() { |
| | | @Override |
| | | public void onReceive(Context context, Intent intent) { |
| | | checkStatus(); |
| | | Log.e("onReceive", "onReceive: >>>>>>>>>>>>下载中"); |
| | | } |
| | | }; |
| | | |
| | | |
| | | //检查下载状态 |
| | | private void checkStatus() { |
| | | DownloadManager.Query query = new DownloadManager.Query(); |
| | | //通过下载的id查找 |
| | | query.setFilterById(downloadId); |
| | | Cursor c = downloadManager.query(query); |
| | | if (c.moveToFirst()) { |
| | | int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); |
| | | switch (status) { |
| | | //下载暂停 |
| | | case DownloadManager.STATUS_PAUSED: |
| | | break; |
| | | //下载延迟 |
| | | case DownloadManager.STATUS_PENDING: |
| | | break; |
| | | //正在下载 |
| | | case DownloadManager.STATUS_RUNNING: |
| | | break; |
| | | //下载完成 |
| | | case DownloadManager.STATUS_SUCCESSFUL: |
| | | if (onProgressChanged != null) { |
| | | onProgressChanged.onFinish(); |
| | | } |
| | | //下载完成安装APK |
| | | if (downloadObserver != null) { |
| | | mContext.getContentResolver().unregisterContentObserver(downloadObserver); |
| | | } |
| | | installAPK(); |
| | | break; |
| | | //下载失败 |
| | | case DownloadManager.STATUS_FAILED: |
| | | Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show(); |
| | | if (downloadObserver != null) { |
| | | mContext.getContentResolver().unregisterContentObserver(downloadObserver); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | c.close(); |
| | | |
| | | } |
| | | |
| | | //下载到本地后执行安装 |
| | | private void installAPK() { |
| | | //获取下载文件的Uri |
| | | Uri downloadFileUri = downloadManager.getUriForDownloadedFile(downloadId); |
| | | if (downloadFileUri != null) { |
| | | Intent intent = new Intent(Intent.ACTION_VIEW); |
| | | intent.setDataAndType(downloadFileUri, "application/vnd.android.package-archive"); |
| | | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
| | | intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); |
| | | mContext.startActivity(intent); |
| | | mContext.unregisterReceiver(receiver); |
| | | } |
| | | } |
| | | |
| | | //获取当前下载进度 |
| | | private int getDownloadPercent(long downloadId) { |
| | | DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId); |
| | | Cursor c = downloadManager.query(query); |
| | | if (c.moveToFirst()) { |
| | | int downloadBytesIdx = c.getColumnIndexOrThrow( |
| | | DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR); |
| | | int totalBytesIdx = c.getColumnIndexOrThrow( |
| | | DownloadManager.COLUMN_TOTAL_SIZE_BYTES); |
| | | long totalBytes = c.getLong(totalBytesIdx); |
| | | long downloadBytes = c.getLong(downloadBytesIdx); |
| | | return (int) (downloadBytes * 100 / totalBytes); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | //进度监听 |
| | | public interface OnProgressListener { |
| | | void onProgressChanged(int progress); |
| | | |
| | | void onFinish(); |
| | | } |
| | | |
| | | //下载apk |
| | | public void download(String url, String name) { |
| | | //创建下载任务 |
| | | DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); |
| | | //移动网络情况下是否允许漫游 |
| | | request.setAllowedOverRoaming(false); |
| | | //在通知栏中显示,默认就是显示的 |
| | | request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); |
| | | request.setTitle(name); |
| | | request.setDescription(name); |
| | | request.setVisibleInDownloadsUi(true); |
| | | //设置下载的路径 |
| | | request.setDestinationInExternalPublicDir(Environment.getExternalStorageDirectory().getAbsolutePath(), name); |
| | | //获取DownloadManager |
| | | downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); |
| | | //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等 |
| | | downloadId = downloadManager.enqueue(request); |
| | | //注册广播接收者,监听下载状态 |
| | | // mContext.registerReceiver(receiver, |
| | | // new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); |
| | | // //添加监听 |
| | | // if (onProgressChanged != null) { |
| | | // Uri uriForDownloadedFile = Uri.parse("content://downloads/"); |
| | | // downloadObserver = new DownloadObserver(); |
| | | // downloadObserver.setOnChangedCallback((selfChange, uri) -> { |
| | | // DownloadManager.Query query = new DownloadManager.Query(); |
| | | // Cursor cursor = downloadManager.query(query); |
| | | // cursor.moveToFirst(); |
| | | // int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); |
| | | // int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); |
| | | // double progress = ((double) bytes_downloaded * 100) / (double) bytes_total; |
| | | // Log.i("TAG", "bytes_downloaded: DX"+bytes_downloaded); |
| | | // Log.i("TAG", "bytes_total: DX"+bytes_total); |
| | | // Log.i("TAG", "progress: DX"+progress); |
| | | // cursor.close(); |
| | | // onProgressChanged.onProgressChanged((int) progress); |
| | | // }); |
| | | // mContext.getContentResolver().registerContentObserver(uriForDownloadedFile, true, downloadObserver); |
| | | // } |
| | | } |
| | | } |