最近開發遇到了個問題,app升級的時候,其他手機都能正常升級,下載完安裝包,跳到安裝頁面進行新版本的安裝。但卻有用戶反映,華為P10和華為Mate 9升級時,怎么也無法跳轉到安裝頁面。起初我以為是華為手機自身系統的問題(因為手上的華為測試機都是正常的),還特地對比了幾種配置的華為手機,最后發現,是Android 8.0系統版本的鍋,不是手機的問題。
2017年8月22日,Google發布了Android 8.0的正式版,其正式名稱為:Android Oreo(奧利奧),Android 8.0強化了權限管理,變得更加安全。在Android 8.0以前,所有的未知來源應用都可以被安裝,或者會彈窗給用戶一個提示,如此設計雖然方便,但是若被引誘安裝了惡意軟件,安裝"未知來源"的應用有可能會對手機系統帶來潛在的危害;
而在Android 8.0的系統中,**未知來源應用權限**的開關被移除掉了,取而代之的是未知來源應用的管理列表,如果你想要安裝某個被自己所信任的開發者的app,則需要在每一次都手動授權"安裝未知應用"的許可。設置頁面如下圖:(在華為Android 8.0中,打開該設置頁面:設置列表—>安全與隱私—>更多安全設置—>安裝未知應用)
*如圖所示*,若某個應用選擇的是“不允許”,那么假設app手動升級的時候,就無法成功跳轉到安裝頁面進行正常的App升級流程了,此時需要手動去授權才行,但是很多用戶并不知道需要這么設置。
廢話說了一大堆,解決其實很簡單。
1.在AndroidManifest.xml文件中,添加REQUEST_INSTALL_PACKAGES權限
1
|
<uses-permission android:name= "android.permission.REQUEST_INSTALL_PACKAGES" /> |
2.在打開安裝包的代碼中添加**兼容Android 8.0**的代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
/** * 打開安裝包 * * @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 ); } } } /** * 跳轉到設置-允許安裝未知來源-頁面 */ @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); } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/zj_blog/article/details/79897241