一、概述
在Android 12的系统中预装了一个第三方的应用商店,但是首次安装应用的时候会提示该商店是未知来源,需要用户跳转到系统设置去给该应用设置成可安装应用。虽然该提示只是在首次安装应用的时候才提示,但是对一个产品来说如果预装的商店弹出此提示,还是会让用户对产品有所怀疑,所以需要把该提示去掉。
二、解决方案
跟踪代码发现,弹窗是中弹出的,在PackageInstallerActivity的OnResume函数中会调用checkIfAllowedAndInitiateInstall()函数去判断是否允许安装
@Override
protected void onResume() {
();
if (mLocalLOGV) (TAG, "onResume(): mAppSnippet=" + mAppSnippet);
if (mAppSnippet != null) {
// load dummy layout with OK button disabled until we override this layout in
// startInstallConfirm
bindUi();
checkIfAllowedAndInitiateInstall();
}
if (mOk != null) {
(mEnableOk);
}
}
在checkIfAllowedAndInitiateInstall()函数中调用isInstallRequestFromUnknownSource(getIntent())判断,发起安装的应用是否是未知来源,如果是则返回true,如果否则返回false
private void checkIfAllowedAndInitiateInstall() {
// Check for install apps user restriction first.
final int installAppsRestrictionSource = (
UserManager.DISALLOW_INSTALL_APPS, ());
if ((installAppsRestrictionSource & UserManager.RESTRICTION_SOURCE_SYSTEM) != 0) {
if (mLocalLOGV) (TAG, "install not allowed: " + UserManager.DISALLOW_INSTALL_APPS);
showDialogInner(DLG_INSTALL_APPS_RESTRICTED_FOR_USER);
return;
} else if (installAppsRestrictionSource != UserManager.RESTRICTION_NOT_SET) {
if (mLocalLOGV) {
(TAG, "install not allowed by admin; showing "
+ Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
}
startActivity(new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS));
finish();
return;
}
if (mAllowUnknownSources || !isInstallRequestFromUnknownSource(getIntent())) {
if (mLocalLOGV) (TAG, "install allowed");
initiateInstall();
} else {
// Check for unknown sources restrictions.
final int unknownSourcesRestrictionSource = (
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, ());
final int unknownSourcesGlobalRestrictionSource = (
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY, ());
final int systemRestriction = UserManager.RESTRICTION_SOURCE_SYSTEM
& (unknownSourcesRestrictionSource | unknownSourcesGlobalRestrictionSource);
if (systemRestriction != 0) {
if (mLocalLOGV) (TAG, "Showing DLG_UNKNOWN_SOURCES_RESTRICTED_FOR_USER");
showDialogInner(DLG_UNKNOWN_SOURCES_RESTRICTED_FOR_USER);
} else if (unknownSourcesRestrictionSource != UserManager.RESTRICTION_NOT_SET) {
startAdminSupportDetailsActivity(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
} else if (unknownSourcesGlobalRestrictionSource != UserManager.RESTRICTION_NOT_SET) {
startAdminSupportDetailsActivity(
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY);
} else {
handleUnknownSources();
}
}
}
所以目前解决方案就是在isInstallRequestFromUnknownSource()函数中,加入要过滤的应用商店的包名判断,如果包名匹配则直接返回false
private boolean isInstallRequestFromUnknownSource(Intent intent) {
if (mCallingPackage != null && (
Intent.EXTRA_NOT_UNKNOWN_SOURCE, false)) {
if (mSourceInfo != null) {
if (( & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)
!= 0) {
// Privileged apps can bypass unknown sources check if they want.
return false;
}
}
}
// modify start
if(mOriginatingPackage != null && "".equals(mOriginatingPackage)){
return false;
}
//modify end
return true;
}