Android6.0 禁止安装未知来源应用

站长的个人作品

推荐使用 极客导航125啦极客导航(http://www.125la.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();

通过判定包名是否包含白名单,比如我的“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();
            }
		}

好的,大概的就这些。

温馨提示:文章内容系作者个人观点,不代表博客志对观点赞同或支持。
版权声明:本文为投稿文章,感谢 125啦读书导航(125la.com) 的投稿,欢迎分享本文,转载请保留出处!
站长的个人作品
125la导航_独立博客导航平台

发表评论

您必须 [登录] 才能发表留言!

或者微信联系我