自定義版本更新彈窗
目錄介紹
1.本庫優勢亮點
2.使用介紹
3.注意要點
4.效果展示
5.其他介紹
好訊息
部落格筆記大彙總【16年3月到至今】,包括Java基礎及深入知識點,Android技術部落格,Python學習筆記等等,還包括平時開發中遇到的bug彙總,當然也在工作之餘收集了大量的面試題,長期更新維護並且修正,持續完善……開源的檔案是markdown格式的!同時也開源了生活部落格,從12年起,積累共計47篇[近20萬字],轉載請註明出處,謝謝!
連結地址:github.com/yangchong21…
如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起於忽微,量變引起質變!
1.本庫優勢亮點
支援後臺下載,支援斷點下載。支援監聽下載過程,下載成功,失敗,異常,下載中,暫停等多種狀態
使用者可以設定是否支援強制更新,還支援使用者設定版本更新內容,當內容過長,可以實現滾動模式
支援進度條顯示,對話方塊進度條,並且下載中支援通知欄進度條展示,解決8.0通知欄不顯示問題
由於下載apk到本地需要許可權,固在lib中已經處理這個邏輯,只有當有讀寫許可權時才會下載檔案,沒有許可權則跳轉設定頁面開啟許可權
呼叫十分簡單,相比AppUpdate,CheckVersionLib等庫的特點是不用設定http的get或者post請求,只需要傳入下載連結就可以
相比GitHub上幾個主流的版本更新庫,我這個lib程式碼量少很多,我覺得最少最精簡的程式碼完成需要的功能就最好
適配 Android 7.0 FileProvider,處理了7.0以上安裝apk異常問題,在lib中已經配置了fileProvider,直接使用就可以
使用dialogFragment替換了dialog,處理了重建後邏輯,dialogFragment深入分析部落格
下載完成後自動安裝,對於錯誤的下載連結地址,會下載異常,也可以檢視異常的日誌
當下載完成後,再次彈窗,則會先判斷本地是否已經下載,如果下載則直接提示安裝
支援設定自定義下載檔案路徑,如果不設定,則直接使用lib中的路徑【sd/apk/downApk目錄下】
當apk下載失敗,異常,錯誤等狀態,支援重啟下載任務。功能十分強大,已經用於正式app多時,你採用拿來主義使用即可,歡迎提出問題。
2.使用介紹
2.1 關於庫匯入
在build.gradle中直接匯入:compile 'cn.yc:YCUpdateLib:1.0.2'
2.2 使用說明
//設定自定義下載檔案路徑
UpdateUtils.APP_UPDATE_DOWN_APK_PATH = "apk" + File.separator + "downApk" ;
String desc = getResources().getString(R.string.update_content_info);
/*
* @param isForceUpdate 是否強制更新
* @param desc 更新文案
* @param url 下載連結
* @param apkFileName apk下載檔案路徑名稱
* @param packName 包名
*/
UpdateFragment.showFragment(MainActivity.this,
false ,firstUrl,apkName,desc,BuildConfig.APPLICATION_ID);
複製程式碼
2.3 lib庫中解決了程式碼中安裝 APK檔案異常問題【注意lib已經解決該問題】
直接呼叫工具類UpdateUtils.installNormal方法
關於在程式碼中安裝 APK 檔案,在 Android N 以後,為了安卓系統為了安全考慮,不能直接訪問軟體,需要使用 fileProvider 機制來訪問、開啟 APK 檔案。裡面if 語句,就是區分軟體執行平臺,來對 intent 設定不同的屬性。
/**
* 關於在程式碼中安裝 APK 檔案,在 Android N 以後,為了安卓系統為了安全考慮,不能直接訪問軟體
* 需要使用 fileProvider 機制來訪問、開啟 APK 檔案。
* 普通安裝
* @param context 上下文
* @param apkPath path,檔案路徑
* @param pathName 你的包名
*/
public static void installNormal(Context context, String apkPath , String pathName) {
if (apkPath==null || pathName==null){
return ;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(apkPath);
// 由於沒有在Activity環境下啟動Activity,設定下面的標籤
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//版本在7.0以上是不能直接通過uri訪問的
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//引數1 上下文, 引數2 Provider主機地址 和配置檔案中保持一致 引數3 共享的檔案
Uri apkUri = FileProvider.getUriForFile(context, pathName+".fileProvider" , apkFile);
//新增這一句表示對目標應用臨時授權該Uri所代表的檔案
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive" );
} else {
Uri uri = Uri.fromFile(apkFile);
intent.setDataAndType(uri, "application/vnd.android.package-archive" );
}
context.startActivity(intent);
}
複製程式碼
<provider
android:name=".VersionFileProvider"
android:authorities="${applicationId} .provider"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
複製程式碼
在res/xml下增加檔案:file_paths.xml
<?xml version="1.0" encoding="utf-8" ?>
<paths>
<external-path
name="external_files"
path="." />
<root-path
name="root_path"
path="." />
</paths>
複製程式碼
3.注意要點
注意需要申請讀寫許可權,如果你要使用,可以自定定義通知欄下載UI佈局,可以自己設定彈窗UI。這裡就不適用正式專案中的UI和圖示,圖示是使用別人的,請勿商用。
4.效果展示
5.其他介紹
關於其他內容介紹
版本更新說明
v1.0.0 更新於2017年8月13日
v1.0.1 更新於2017年12月9日
v1.0.2 更新於2017年11月21日
關於部落格彙總連結
關於LICENSE
Licensed under the Apache License, Version 2.0 (the "License" );
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
複製程式碼