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

Android  2018年11月20日 am8:59发布6年前 (2018)更新 91es.com站长
83 0 0


推荐使用 极客导航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();
            }
		}

好的,大概的就这些。

 历史上的今天

  1. 2023: Android开机动画关闭源码分析(0条评论)
  2. 2019: 毛姆:什么是好小说(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

钱钟书:论快乐

在旧书铺里买回来维尼(vigny)的《诗人日记》(journaldunpote),信手翻开,就看见有趣的一条。他说,在法语里,喜乐(bonheur)一个名词是“好”和“钟点”两字拼成,可见好事多磨,只是个把钟头的玩意儿。我们联想到我们本国话的说法,也同样的意味深长,譬如快活或快乐的快字,就把人生一切...

朱以撒:浅色寂语

秋天来了,山野闪动着风吹过的暗影。叶片开始有秩序地脱离枝条,原先紧挨在一起的两片树叶,一片先下来了,另一片落下来的时候,再也见不到它旧日的邻居。交接的日子来临,一些矮小的灌木丛里,浆果外表抹上了一层紫黑,一只翠绿的螳螂举着带锯的刀,轻轻划了一下,浆水霎时奔涌而出,紫透了枝下的土皮。稻子已经进仓,秋...

[摘]Java垃圾回收机制(GC)详解

简介:垃圾回收GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定...

刘年:写给儿子刘云帆

1突然想到了身后的事。写几句话给儿子。其实,火葬最干净。只是我们这里没有。 不要开追悼会,这里,没有一个人懂得我的一生。 不要请道士,他们唱得实在不好听。 放三天吧,我等一个人,很远。三天过后没有,就算了。有的人,永远都是错过。 ...

addr2line.exe的简单使用

前言不常用,偶尔需要,在学习JNI时也学习addr2line工具的使用,记录于此,方便自己查阅。正文addr2line工具在Android NDK包中,我这里以Window版的为例。我这下载的是android-ndk-r21d-windows-x86_64.zip解压和环境配置我这不解...

刘继荣:不想当英雄,只想做那个坐在路边为英雄鼓掌的人

23号女儿女儿在班上,同学都管她叫23号。她班上总共有50个人,而每次考试,女儿都排名23。久而久之,便有了这个雅号,她也就成了名副其实的中等生。我们觉得这外号刺耳,女儿却欣然接受。老公发愁地说,一碰到公司活动,或者老同学聚会,别人都对自家的“小超人”赞不绝口,他却只能扮深沉。人家的孩子,不仅...