91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于DownloadManager如何實現下載器

發布時間:2021-08-07 13:54:31 來源:億速云 閱讀:121 作者:小新 欄目:移動開發

小編給大家分享一下基于DownloadManager如何實現下載器,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

DownloadManager的基本使用姿勢

通過getSystemService進行實例化

DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
構建下載請求

DownloadManager.Request request = new DownloadManager.Request(Uri.parse("目標文件下載地址"));
//設置目標文件夾,如果你想在系統的storage目錄下載一個testDownload/test/test.apk
request.setDestinationInExternalPublicDir("testDownload", "test/test.apk");
//設置下載所需的網絡環境,設置了移動網絡和WiFi環境下均能下載 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
//通知欄設置
//顯示在通知欄
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);

注意!!!如果選擇不顯示在通知欄,那么必須聲明以下權限

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />

然后設置不可見

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) {

    //構建一個數組,存放已下載文件大小、總大小、下載狀態
    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()) {
        //已經下載文件大小
        bytesAndStatus[0] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
        //下載文件的總大小
        bytesAndStatus[1] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
        //下載狀態
        bytesAndStatus[2] = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
      }
    } finally {
      if (cursor != null) {
        cursor.close();
      }
    }
    return bytesAndStatus;
  }

注冊監聽文件下載成功的廣播

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;

               }

         }
      }
    };
//注冊,這里只能攔截文件下載成功的廣播,并不能進行進度監聽,在適當的地方取消訂閱廣播
context.registerReceiver(downloadCompleteReceiver,
        new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

網上很多博客都是通過自定義ContentObserver獲取本地文件變化,其實可以另辟蹊徑,通過一個定時器間隔調用以上getBytesAndStatus(long downloadId)能達到同樣的效果,用Rxjava實現一個簡單的定時器

/**
 * 由于DownloadManager自身沒有提供實時進度的api,所以通過以下定時器獲取已下載的文件大小
 */
  private void updateProgress() {
        //每隔0.5秒刷新一次進度,在適當的地方記得注銷 timeDisposable
        Disposable timeDisposable = Observable.interval(500, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread()).subscribe(new DataConsumer<Long>() {
          @Override
          public void acceptData(@io.reactivex.annotations.NonNull Long aLong) {

            int [ ] bytesAndStatus = getBytesAndStatus(downloadId);
            //todo 在這里進行回調即可
          }
        });

  }

了解完DownloadManager基本的使用方式,那么基于它來封裝一個簡單易用的下載器吧!

實現效果

 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如何實現下載器”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

谢通门县| 鸡东县| 罗田县| 察哈| 甘孜县| 惠州市| 龙岩市| 成安县| 镇坪县| 望江县| 平罗县| 安阳县| 普洱| 鄂托克前旗| 马关县| 台北县| 自治县| 项城市| 永寿县| 游戏| 孟连| 宽甸| 岫岩| 磴口县| 鹤岗市| 卢湾区| 珲春市| 新昌县| 镇赉县| 常州市| 木里| 贵南县| 镇远县| 武隆县| 兰溪市| 大安市| 三都| 新宁县| 宜兴市| 康定县| 涿州市|