已經(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
安卓自帶的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ì)在通知欄中展示铆铆。
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)明來源和作者,謝謝瞎抛!否則都為盜版艺演。