android禁止安装第三方app,Android6.0 禁止安装未知来源应用

在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.

*

*

1 = permit app installation via the system package installer intent

*

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();

通过判定包名是否包含白名单,比如我的“125la.com”

if( mPkgInfo.packageName.contains("125la.com")){

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();

}

}

好的,大概的就这些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值