Android apk下載工具類(兼容android8.0版本)

這個(gè)工具類親測(cè)實(shí)用,兼容安卓8.0,廢話不說上代碼:

package com.djfb.utils;

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.Build;

import android.os.Environment;

import android.support.v4.content.FileProvider;

import java.io.File;

import java.io.IOException;

/**

* Created by HJS on 2018/4/8.

*/

public class DownloadUtils {

//下載器

? private static DownloadManagerdownloadManager;

? //下載的ID

? private static long downloadId;

? private static StringapkFileName ="djfb.apk";

????private static Context mcontext;

? //廣播監(jiān)聽下載的各個(gè)狀態(tài)

? private static BroadcastReceiverreceiver =new BroadcastReceiver() {

@Override

? ? public void onReceive(Context context, Intent intent) {

checkStatus();

? ? }

};

? //下載apk

? public static void downloadAPK(String url) {

//刪除舊包

? ? File oldApkFile =new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), apkFileName);

? ? if(oldApkFile.exists()){

oldApkFile.delete();

? ? }

//創(chuàng)建下載任務(wù)

? ? DownloadManager.Request request =new DownloadManager.Request(Uri.parse(url));

? ? //移動(dòng)網(wǎng)絡(luò)情況下是否允許漫游

? ? request.setAllowedOverRoaming(false);

? ? //在通知欄中顯示,默認(rèn)就是顯示的

? ? request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);

? ? request.setTitle("電競(jìng)風(fēng)暴");

? ? request.setDescription("深圳電競(jìng)風(fēng)暴科技有限公司");

? ? request.setVisibleInDownloadsUi(true);

? ? request.setMimeType("application/vnd.android.package-archive");

? ? //設(shè)置下載的路徑

? ? request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS , apkFileName);

? ? //獲取DownloadManager

? ? downloadManager = (DownloadManager) mcontext.getSystemService(Context.DOWNLOAD_SERVICE);

? ? //將下載請(qǐng)求加入下載隊(duì)列,加入下載隊(duì)列后會(huì)給該任務(wù)返回一個(gè)long型的id,通過該id可以取消任務(wù),重啟任務(wù)、獲取下載的文件等等

? ? downloadId =downloadManager.enqueue(request);

? ? //動(dòng)態(tài)注冊(cè)廣播接收者,監(jiān)聽下載狀態(tài)

? ? mcontext.registerReceiver(receiver,

? ? ? new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

? }

//檢查下載狀態(tài)

? private static 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:

//下載完成安裝APK

? ? ? ? ? installAPK();

break;

? ? ? ? //下載失敗

? ? ? ? case DownloadManager.STATUS_FAILED:

ToastUtils.showToast("下載失敗");

break;

? ? ? }

}

c.close();

? }

/**

? * 兼容 android 8.0

? */

? private static void installAPK() {

File apkFile =

new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), apkFileName);

? ? Intent intent =new Intent(Intent.ACTION_VIEW);

? ? intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

? ? try {

//如果沒有設(shè)置SDCard寫權(quán)限,或者沒有sdcard,apk文件保存在內(nèi)存中,需要授予權(quán)限才能安裝

? ? ? String[] command = {"chmod", "777", apkFile.toString()};

? ? ? ProcessBuilder builder =new ProcessBuilder(command);

? ? ? builder.start();

? ? ? if (Build.VERSION.SDK_INT >=24) {

Uri apkUri = FileProvider.getUriForFile(context, context.getPackageName() +".updateFileProvider", apkFile);

? ? ? ? intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

? ? ? ? intent.setDataAndType(apkUri, "application/vnd.android.package-archive");

? ? ? }else {

intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");

? ? ? }

startActivity(intent);

? ? }catch (IOException ignored) {

ignored.printStackTrace();

? ? }

}

}


有問題請(qǐng)留言,喜歡點(diǎn)波贊吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,317評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,893評(píng)論 25 709
  • DownloadManager實(shí)現(xiàn)下載、安裝更新app功能 一款app必不可少的功能,就是自動(dòng)檢測(cè)版本實(shí)現(xiàn)下載、安...
    一點(diǎn)愁閱讀 1,859評(píng)論 0 5
  • 文件操作## 讀取文件 可以使用with塊縮短代碼 分塊讀取 按行讀取:如果要一次性讀取所有行,只需調(diào)用readl...
    趙佳辰閱讀 341評(píng)論 0 0

友情鏈接更多精彩內(nèi)容