先看完成圖(系統Android 7.0, API 24)↓
在這裡練習的APK(此專案的apk檔-VersionCode為2)下載網址為
https://github.com/SolinariWu/AutomaticallyOpenApk/raw/master/Solinari.apk
上一個例子有一個About的頁面,關於此APP的資訊,我們新增一個Update的按鈕。
about.xml
Android Manifest中加入權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我們透過DownloadManager這個System Service來進行下載的動作,將路徑設置於外部公開空間(Public external storage),並針對Andriud 6.0以上版本的系統,檢查是否有讀取的權限。
About.java
執行效果如下(可以注意到左上角有下載圖示)↓
這時候,當左上角的下載圖示消失時,我們如果至我們設定下載路徑底下可以發現,APK檔已被成功下載下來了,但這距離我想要的效果還差了許多,在下載過程中,我想要使用者能直接一目瞭然目前的下載進度,而不需要拉下提示欄觀看,那要怎麼實現呢?
先設計一個進度對話框,download_apk_dialog.xml
撰寫一個DialogFragmentHelper.java,用來呼叫DialogFragment
再來,於About.java中撰寫一個類別DownloadObserver,繼承ContentObserver,用來觀察下載進度的變化 再來於About.java中DownloadNewVersion(),開啟進度對話框,並於DownloadManagerEnqueue()註冊ContentObserver(CONTENT_URI的值不能改變)
讓我們來看看效果↓
撰寫SharedPreferencesHelper.java
撰寫BroadcastReceiver之前,針對7.0以上版本的手機,在取得APK檔的Uri時,需要透FileProvider,才可以正常運作,先在Android Manifest中加入
並於res目錄底下新增一個xml資料夾並新增一個file_paths.xml
撰寫DownloadCompleteReceiver.java
最後,在DownloadManagerEnqueue()中註冊BroadcastReceiver並儲存DownloadID
大功造成!
參考文獻:DownloadManager+MaterialDialog下載進度和6.0安裝APK和"程式未安裝"問題
解決 Android N 上 錯誤:android.os.FileUriExposedException
Android 6.0 儲存權限
完整專案:Solinari GitHub