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

Android  2018年11月20日 am8:59发布6年前 (2018)更新 城堡大人
107 0 0


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

好的,大概的就这些。

 历史上的今天

  1. 2024: Android开机后无法收到上下曲(0条评论)
  2. 2023: Android开机动画关闭源码分析(0条评论)
  3. 2019: 毛姆:什么是好小说(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

ListView item布局简单记录

前言简单记录一下ListView中ItemLayout正文下面布局按下后文字和图片都按按下效果颜色变化。隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参考文章

彼得.B.巴赫:失去爱人的滋味

布宜诺斯艾利斯的街灯要比纽约的街灯暗得多,这是我们在阿根廷的半年里最深刻的体会。我们租用的车子老旧,车身落满了这座城市的灰尘,前挡风玻璃更加遮蔽了射进来的光。当我们驾车离开当地医院,在第一个路口等红灯时,我打破了我对露丝许下的两个最重要的结婚誓言:第一,我以一个医生的口吻和她说了话;第二,我欺骗了她...

柴静:真实的人性有无尽的可能

1几年前我采访过一个人。他被诬陷嫖妓,证据是卖淫者的供述,他被拘留了42天,放了。校长当不了了,儿子的婚事也吹了“他爹是个大流氓,人还能好么?”他告了十六年,路上带不了两个钱还叫人掏包了,捡人家饭吃。我问他最难受的是什么。“最难忍受就是开党员会的时候我不是党员了”他说。2我们找到了当...

郑愁予:生命

滑落过长空的下坡,我是熄了灯的流星。正乘夜雨的微凉,赶一程赴赌的路。待投掷的生命如雨点,在湖上激起一夜的迷雾。够了,生命如此的短,竟短得如此的华美!偶然间,我是胜了,造物自迷於锦绣的设局。毕竟是日子如针,曳着先浓後淡的彩线;起落的拾指之间,反绣出我偏傲的明暗。算了,生命如...

王朔:上一秒痛苦,下一秒无聊

每天晚上我都睡得很晚,不是不困,而是不想睡,强迫自己不要睡。我似乎得了强迫症,我很忧郁。因为我总觉得一天什么都没干就这么过去了,实在不甘心!于是我就尽量延长这一天的时间。我真是个有志气的人,我很欣慰。志气是有了,可是找不到有志气的事情干,我很忧郁。幸好还有个电视,最妙的是还有个遥控器。遥控器真...

Android画中画新增自定义按键简介

前言Android 8.0 Oreo(API Level 26)允许活动启动画中画 Picture-in-picture(PIP)模式。PIP 是一种特殊类型的多窗口模式,主要用于视频播放。这次介绍是在画中画界面自定义按键。参考其他文章,记录于此,方便自己查阅。正文上一篇《Android...