安卓自帶下載框架——DownLoaderManger

已經(jīng)超過大半年沒有寫博客了,這大半年還是學(xué)到了很多的東西忧吟,但是一直缺少總結(jié)砌函,寫博客的目的無非就以下幾個(gè):1、對(duì)自己學(xué)習(xí)的技術(shù)做好總結(jié)溜族。 2讹俊、分享自己學(xué)到的東西,可能會(huì)給其他開發(fā)的伙伴帶來幫助煌抒。3仍劈、給分享技術(shù),開源帶來自己的一份微薄之力寡壮。

DownLoaderManger這個(gè)老早以前就想發(fā)表一篇博客了贩疙,剛剛接觸的時(shí)候讹弯,確實(shí)非常方便而且很簡單。這篇博客主要涉及到封裝DownLoaderManger下載器这溅,以及FileProvider對(duì)androidX的一些兼容問題组民。

1、主要邏輯

主要邏輯

2悲靴、需要的權(quán)限

完成一個(gè)apk從下載到安裝需要的權(quán)限如下:

  • 需要訪問網(wǎng)絡(luò)臭胜,添加網(wǎng)絡(luò)權(quán)限。
  • 需要下載文件和安裝apk对竣,添加讀寫文件權(quán)限庇楞。
  • 需要安裝apk,添加請(qǐng)求安裝應(yīng)用的權(quán)限否纬。
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

3、安卓自帶的DownloadManger

DownloadManger

安卓自帶的DownLoaderManger是安卓系統(tǒng)提供的一個(gè)下載器蛋褥,它是一個(gè)系統(tǒng)的服務(wù)临燃。獲取的方式為:

var downloadManager: DownloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager

DownloadManager有一個(gè)Request來構(gòu)建下載的一些參數(shù)和notification的一些樣式等等。最后通過DownloadManager的DownloadManager.enqueue()方法啟動(dòng)下載烙心。以下是源碼中的部分代碼(具體源碼地址在文章最后)膜廊。

           // 真正的下載邏輯,Request用來構(gòu)建下載所使用的參數(shù)。
            val request = DownloadManager.Request(Uri.parse(url))
            request.setTitle(title)
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE or DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
            request.setMimeType("application/vnd.android.package-archive")
            if (TextUtils.isEmpty(title)) {
                request.setDescription(fileName)
            } else {
                request.setDescription(title)
            }

            try {
                if (DownLoaderManager.downloadManager == null) {
                    // 可能部分機(jī)型不支持這個(gè)DownloaderManger 淫茵,這邊可以使用自定義的下載框架
                    return
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }


            request.setDestinationUri(Uri.fromFile(file))
            if (DownLoaderManager.downloadManager != null) {
                downloadId = DownLoaderManager.downloadManager!!.enqueue(request)
           }

注意爪瓜,可能有些手機(jī)不支持這個(gè)框架,所以這了有一行代碼:

  if (DownLoaderManager.downloadManager == null) {
                    // 可能部分機(jī)型不支持這個(gè)DownloaderManger 匙瘪,這邊可以使用自定義的下載框架
                    return
   }

如果代碼執(zhí)行成功則會(huì)在通知欄中展示铆铆。


下載的狀態(tài)

4、下載完成的監(jiān)聽

DownloaderManger文件下載完成之后是通過廣播監(jiān)聽的丹喻,然后通過downLoadId來獲取文件的Uri薄货,最后通過Uri安裝軟件。
廣播注冊(cè)的方式有兩種碍论,這里介紹在AndroidMainfest中的這種:

        <receiver android:name=".downloader.DownLoaderBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
            </intent-filter>
        </receiver>
class DownLoaderBroadcastReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
   
    }
}

5谅猾、File Provider在7.0和androidX上的區(qū)別

File Provider是在安卓7.0的新特性,但是在x上又有不同的區(qū)別鳍悠,實(shí)際上修改起來也非常簡單税娜,只需要修改一個(gè)參數(shù)即可。
7.0:

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.fileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

androidX:

        <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="${applicationId}.fileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
            <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths"/>
        </provider>

就name不一樣藏研,其他的都一樣敬矩。

6、源碼

注意:

  • 這邊用的是androidX遥倦,這邊的file provider有所區(qū)別谤绳。
  • 語言使用的是Kotlin(Kotlin已經(jīng)是官方語言哦占锯,建議安卓開發(fā)都用它)

https://github.com/AxeChen/DownLoaderManagerDemo
如果對(duì)你有幫助,點(diǎn)個(gè)贊再走哦缩筛。:)

本文章在簡書上發(fā)布消略,其他平臺(tái)使用請(qǐng)標(biāo)明來源和作者,謝謝瞎抛!否則都為盜版艺演。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桐臊,隨后出現(xiàn)的幾起案子胎撤,更是在濱河造成了極大的恐慌,老刑警劉巖断凶,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伤提,死亡現(xiàn)場離奇詭異,居然都是意外死亡认烁,警方通過查閱死者的電腦和手機(jī)肿男,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却嗡,“玉大人舶沛,你說我怎么就攤上這事〈凹郏” “怎么了如庭?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撼港。 經(jīng)常有香客問我坪它,道長,這世上最難降的妖魔是什么餐胀? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任哟楷,我火速辦了婚禮,結(jié)果婚禮上否灾,老公的妹妹穿的比我還像新娘卖擅。我一直安慰自己,他們只是感情好墨技,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布惩阶。 她就那樣靜靜地躺著,像睡著了一般扣汪。 火紅的嫁衣襯著肌膚如雪断楷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天崭别,我揣著相機(jī)與錄音冬筒,去河邊找鬼恐锣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舞痰,可吹牛的內(nèi)容都是我干的土榴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼响牛,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼玷禽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呀打,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤矢赁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贬丛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撩银,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年瘫寝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜒蕾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焕阿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出首启,到底是詐尸還是另有隱情暮屡,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布毅桃,位于F島的核電站褒纲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钥飞。R本人自食惡果不足惜莺掠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望读宙。 院中可真熱鬧彻秆,春花似錦、人聲如沸结闸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桦锄。三九已至扎附,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間结耀,已是汗流浹背留夜。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工匙铡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碍粥。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓鳖眼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親即纲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子具帮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344