推荐使用 极客导航 :125啦极客导航(http://www.91es.com/jike.html)
在Android 中可以禁止安装第三方应用,如果你的设备需要禁止所有应用安装,你就可以在这做些文章。
/**
* @deprecated Use {@link android.provider.Settings.Secure#INSTALL_NON_MARKET_APPS} instead
*/
@Deprecated
public static final String INSTALL_NON_MARKET_APPS = Secure.INSTALL_NON_MARKET_APPS;
6.0 中推荐使用如下,以前的已经废弃了。
/**
* Whether applications can be installed for this user via the system's
* {@link Intent#ACTION_INSTALL_PACKAGE} mechanism.
*
* <p>1 = permit app installation via the system package installer intent
* <p>0 = do not allow use of the package installer
*/
public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
从上面可以知道,1 表示允许安装,0表示禁止安装
可以使用如下方式进行配置
Settings.Global.putInt(context.getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS,0);//0表示不允许安装
在Android系统中在SettingsProvider应用可以有默认的配置,要了解更多去看源码(可以搜索”INSTALL_NON_MARKET_APPS“)
当然,熟悉Android的用户就会知道,在系统设置中的[安全]选项中可以自己打开这个允许[未知来源]的开关,如果打开后,用户还是可以再次安装的。
如果,这只是如果哈,你们的PM说需要设置中的功能也干掉,你需要下面其中一个:
1、设置应用中影藏这个[未知来源]选项
2、不允许这个[未知来源]选项控件点击
禁止安装后,你会发现其他的是不是也被禁止了。
哈哈,你肯定被你们的PM骂了一顿吧,因为我也被骂了。当然如果您设备不需要升级就没问题。
现在我们需要解决这个问题。
找到在packages/apps/PackageInstaller这个目录中的
/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
在onCreate()中找到如下代码:
// Block the install attempt on the Unknown Sources setting if necessary.
if (!requestFromUnknownSource) {
initiateInstall();
return;
}
if (!unknownSourcesAllowedByAdmin
|| (!unknownSourcesAllowedByUser && isManagedProfile)) {
showDialogInner(DLG_ADMIN_RESTRICTS_UNKNOWN_SOURCES);
mInstallFlowAnalytics.setFlowFinished(
InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);
} else if (!unknownSourcesAllowedByUser) {
// Ask user to enable setting first
showDialogInner(DLG_UNKNOWN_SOURCES);
mInstallFlowAnalytics.setFlowFinished(
InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);
} else {
initiateInstall();//
}
从上面看出,只有满足不满足上面条件才能执行initiateInstall()这个方法。
我这里简单的介绍一下这里满足的条件。
boolean requestFromUnknownSource = isInstallRequestFromUnknownSource(intent);
final boolean unknownSourcesAllowedByAdmin = isUnknownSourcesAllowedByAdmin();
final boolean unknownSourcesAllowedByUser = isUnknownSourcesEnabled();
final boolean isManagedProfile = mUserManager.isManagedProfile();
private boolean isInstallRequestFromUnknownSource(Intent intent) {
String callerPackage = getCallingPackage();
if (callerPackage != null && intent.getBooleanExtra(
Intent.EXTRA_NOT_UNKNOWN_SOURCE, false)) {
try {
mSourceInfo = mPm.getApplicationInfo(callerPackage, 0);
if (mSourceInfo != null) {
if ((mSourceInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)
!= 0) {
// Privileged apps are not considered an unknown source.
return false;
}
}
} catch (NameNotFoundException e) {
}
}
return true;
}
/**
* @return whether the device admin restricts installation from unknown sources
*/
private boolean isUnknownSourcesAllowedByAdmin() {
return !mUserManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
}
/**
* @return whether unknown sources is enabled by user in Settings
*/
private boolean isUnknownSourcesEnabled() {
return Settings.Secure.getInt(getContentResolver(),
Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0;
}
/**
* Checks if the calling app is running in a managed profile.
* Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
*
* @return whether the caller is in a managed profile.
* @hide
*/
@SystemApi
public boolean isManagedProfile() {
UserInfo user = getUserInfo(UserHandle.myUserId());
return user != null ? user.isManagedProfile() : false;
}
由于我们是默认禁止的,但又需要设置白名单,因此需要添加判定条件,绕开上面的条件直接进入initiateInstall();
通过判定包名是否包含白名单,比如我的“”
if( mPkgInfo.packageName.contains("")){
initiateInstall();
}else{
//不满足我们白名单,因此直接走这里,按照系统原来的配置的流程
if (!unknownSourcesAllowedByAdmin
|| (!unknownSourcesAllowedByUser && isManagedProfile)) {
showDialogInner(DLG_ADMIN_RESTRICTS_UNKNOWN_SOURCES);
mInstallFlowAnalytics.setFlowFinished(
InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);
} else if (!unknownSourcesAllowedByUser) {
// Ask user to enable setting first
showDialogInner(DLG_UNKNOWN_SOURCES);
mInstallFlowAnalytics.setFlowFinished(
InstallFlowAnalytics.RESULT_BLOCKED_BY_UNKNOWN_SOURCES_SETTING);
} else {
initiateInstall();
}
}
好的,大概的就这些。