小編給大家分享一下基于DownloadManager如何實現(xiàn)下載器,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都做網(wǎng)站、網(wǎng)站制作、肇慶網(wǎng)絡推廣、重慶小程序開發(fā)、肇慶網(wǎng)絡營銷、肇慶企業(yè)策劃、肇慶品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供肇慶建站搭建服務,24小時服務熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
DownloadManager的基本使用姿勢
通過getSystemService進行實例化
DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE); 構建下載請求 DownloadManager.Request request = new DownloadManager.Request(Uri.parse("目標文件下載地址")); //設置目標文件夾,如果你想在系統(tǒng)的storage目錄下載一個testDownload/test/test.apk request.setDestinationInExternalPublicDir("testDownload", "test/test.apk"); //設置下載所需的網(wǎng)絡環(huán)境,設置了移動網(wǎng)絡和WiFi環(huán)境下均能下載 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI); //通知欄設置 //顯示在通知欄 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
注意?。?!如果選擇不顯示在通知欄,那么必須聲明以下權限
然后設置不可見
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
否則將會拋出一個securityException
//設置文件類型為apk類型,當downloadManager調用openFile時會喚起相應的程序 request.setMimeType("application/cn.trinea.download.file"); //開始下載,得到一個唯一的downloadId,大有用處 long downloadId = downloadManager.enqueue(request);
如何獲取下載的情況呢
private int[] getBytesAndStatus(long downloadId) { //構建一個數(shù)組,存放已下載文件大小、總大小、下載狀態(tài) int[] bytesAndStatus = new int[]{ -1, -1, 0 }; //通過構建下載請求時獲得的downloadId進行文件查詢 DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId); Cursor cursor = null; try { cursor = downloadManager.query(query); if (cursor != null && cursor.moveToFirst()) { //已經(jīng)下載文件大小 bytesAndStatus[0] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); //下載文件的總大小 bytesAndStatus[1] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); //下載狀態(tài) bytesAndStatus[2] = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); } } finally { if (cursor != null) { cursor.close(); } } return bytesAndStatus; }
注冊監(jiān)聽文件下載成功的廣播
private BroadcastReceiver downloadCompleteReceiver; downloadCompleteReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //文件下載成功時 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_SUCCESSFUL: break; } } } }; //注冊,這里只能攔截文件下載成功的廣播,并不能進行進度監(jiān)聽,在適當?shù)牡胤饺∠嗛啅V播 context.registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
網(wǎng)上很多博客都是通過自定義ContentObserver獲取本地文件變化,其實可以另辟蹊徑,通過一個定時器間隔調用以上getBytesAndStatus(long downloadId)能達到同樣的效果,用Rxjava實現(xiàn)一個簡單的定時器
/** * 由于DownloadManager自身沒有提供實時進度的api,所以通過以下定時器獲取已下載的文件大小 */ private void updateProgress() { //每隔0.5秒刷新一次進度,在適當?shù)牡胤接浀米N timeDisposable Disposable timeDisposable = Observable.interval(500, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new DataConsumer() { @Override public void acceptData(@io.reactivex.annotations.NonNull Long aLong) { int [ ] bytesAndStatus = getBytesAndStatus(downloadId); //todo 在這里進行回調即可 } }); }
了解完DownloadManager基本的使用方式,那么基于它來封裝一個簡單易用的下載器吧!
實現(xiàn)效果
DownloadHelper.Builder builder = new DownloadHelper.Builder(this).title("下載通知") .description("正在下載新版本V1.2.0") .downloadUrl("http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk") .fileSaveName("MobileAssistant_1.apk").fileSavePath("testDownload") .notifyVisible(true) .fileType(DownloadHelper.FileType.APK).apkInstallHint(true).onProgressListener(new DownloadHelper.OnDownloadProgressListener() { @Override public void onProgress(int downloadedSize, int totalSize) { int progress =(int)((downloadedSize*1.0f/totalSize)*100); Logger.d("progress=%d",progress); //進度回調 } @Override public void onSuccess(Uri fileUri) { //文件下載成功回調的Uri } @Override public void onFail() { //文件下載失敗 } @Override public void fileAlreadyExits(File file) { //當你想重復下載同樣的文件時,本地檢測是否存在同樣的文件,進行回調 } }); DownloadHelper downloadHelper = builder.build(); //開始下載 downloadHelper.start(); //移除下載任務 downloadHelper.deleteDownloadFile();
以上是“基于DownloadManager如何實現(xiàn)下載器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!