最近開發(fā)遇到了個問題绞绒,app升級的時候婶希,其他手機都能正常升級,下載完安裝包蓬衡,跳到安裝頁面進行新版本的安裝喻杈。但卻有用戶反映,華為P10和華為Mate 9升級時狰晚,怎么也無法跳轉(zhuǎn)到安裝頁面筒饰。起初我以為是華為手機自身系統(tǒng)的問題(因為手上的華為測試機都是正常的),還特地對比了幾種配置的華為手機壁晒,最后發(fā)現(xiàn)瓷们,是Android 8.0系統(tǒng)版本的鍋,不是手機的問題。
2017年8月22日换棚,Google發(fā)布了Android 8.0的正式版式镐,其正式名稱為:Android Oreo(奧利奧),Android 8.0強化了權(quán)限管理固蚤,變得更加安全。在Android 8.0以前歹茶,所有的未知來源應用都可以被安裝夕玩,或者會彈窗給用戶一個提示,如此設計雖然方便惊豺,但是若被引誘安裝了惡意軟件燎孟,安裝"未知來源"的應用有可能會對手機系統(tǒng)帶來潛在的危害;
而在Android 8.0的系統(tǒng)中尸昧,未知來源應用權(quán)限的開關(guān)被移除掉了揩页,取而代之的是未知來源應用的管理列表,如果你想要安裝某個被自己所信任的開發(fā)者的app,則需要在每一次都手動授權(quán)"安裝未知應用"的許可烹俗。設置頁面如下圖:(在華為Android 8.0中爆侣,打開該設置頁面:設置列表—>安全與隱私—>更多安全設置—>安裝未知應用)
如圖所示,若某個應用選擇的是“不允許”幢妄,那么假設app手動升級的時候兔仰,就無法成功跳轉(zhuǎn)到安裝頁面進行正常的App升級流程了,此時需要手動去授權(quán)才行蕉鸳,但是很多用戶并不知道需要這么設置乎赴。
廢話說了一大堆,解決其實很簡單潮尝。
1.在AndroidManifest.xml文件中榕吼,添加REQUEST_INSTALL_PACKAGES權(quán)限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
2.在打開安裝包的代碼中添加兼容Android 8.0的代碼。
/**
* 打開安裝包
*
* @param mContext
* @param fileUri
*/
public void openAPKFile(Activity mContext, String fileUri) {
DataEmbeddingUtil.dataEmbeddingAPPUpdate(fileUri);
// 核心是下面幾句代碼
if (null != fileUri) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(fileUri);
//兼容7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileProvider", apkFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
//兼容8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
ToastUtil.makeText(MyApplication.getContext(), MyApplication.getContext().getString(R.string.string_install_unknow_apk_note), false);
startInstallPermissionSettingActivity();
return;
}
}
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
if (mContext.getPackageManager().queryIntentActivities(intent, 0).size() > 0) {
mContext.startActivity(intent);
}
} catch (Throwable e) {
e.printStackTrace();
DataEmbeddingUtil.dataEmbeddingAPPUpdate(e.toString());
CommonUtils.makeEventToast(MyApplication.getContext(), MyApplication.getContext().getString(R.string.download_hint), false);
}
}
}
/**
* 跳轉(zhuǎn)到設置-允許安裝未知來源-頁面
*/
@RequiresApi(api = Build.VERSION_CODES.O)
private void startInstallPermissionSettingActivity() {
//注意這個是8.0新API
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
最后勉失,附上我的一個Kotlin編寫+組件化開發(fā)的開源項目Designer
Kotlin+組件化開發(fā)實踐—開源項目Designer-App
Designer項目算是傾注了我蠻多心血了羹蚣,每個頁面和功能都當成是上線的App來做,App的logo還特地做了UI設計??力求做到精致和完善戴质,其中還包括了很多自己項目開發(fā)中的經(jīng)驗匯總和對新技術(shù)的探索和整合度宦,希望對各位讀者有所幫助,歡迎點個star告匠,follow戈抄,或者給個小心心,嘻嘻??也可以分享給你更多的朋友一起學習后专,您的支持是我不斷前進的動力划鸽。如果有任何問題,歡迎在GitHub上給我提issue或者留言。