首先,我在AOSP环境中工作,我在这里提到的两个应用程序都是使用Android源代码构建的,并且是系统应用程序(UID是系统)。
首次启动/恢复出厂时启动的应用程序将使用android.intent.action.DEVICE_INITIALIZATION_WIZARD
意图过滤器。当应用程序完成它的工作时,它会使用代码
PackageManager pm = mContext.getPackageManager();
pm.setComponentEnabledSetting(new ComponentName("com.xyzapp",
"com.xyzapp.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
一切正常。我面临的问题是重新启用我正在尝试从另一个应用程序执行的活动(服务更精确)。
与禁用它几乎相同:
PackageManager pm = mContext.getPackageManager();
pm.setComponentEnabledSetting(new ComponentName("com.xyzapp",
"com.xyzapp.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
这种方法不起作用,我无法弄清楚原因。
以下是它应如何运作的快速概述:
com.xyzapp.MainActivity
com.xyzapp.MainActivity
之前的最后一个流程应该重新启用,以便它在下次启动之前启动< / strong>启动器任何提示,想法?
感谢名单
答案 0 :(得分:0)
因此,从private void setEnabledSetting(final String packageName, String className, int newState, final int flags, int userId, String callingPackage)
检查PackagemanagerService.java
这些是它具有的关键安全检查:
uid
是否为system
。如果它是system
,则全部保存,如果没有,则应该android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE
权限。 对于这两种情况,您都会收到SecurityException
,其中包含不同的消息。
throw new SecurityException(
"Permission Denial: attempt to change component state from pid="
+ Binder.getCallingPid()
+ ", uid=" + uid + ", package uid=" + pkgSetting.appId);
throw new SecurityException("Cannot disable a protected package: " + packageName);
您是否获得任何SecurityExceptions?尝试添加权限:CHANGE_COMPONENT_ENABLED_STATE
。
您尝试从哪些进程启用该应用程序?它有什么UID?如果你能把它变成系统,我会说你会避免一些安全检查。
希望它有所帮助。