【问题标题】:Android PackageManager enable any applicationAndroid PackageManager 启用任何应用程序
【发布时间】:2011-12-09 13:03:50
【问题描述】:

我开发了一个应用程序,我已经启用了我们拥有的任何应用程序都可以手动安装

但我的问题是我只想启用我自己的包名,而不是任何其他应用程序包名。

这是我使用的代码。

try {
    PackageManager pm1 = getPackageManager();

    pm1.setComponentEnabledSetting(new ComponentName("com.service",
    "com.service.EnableActivity"),
    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP
    );
} catch (SecurityException e) {
    e.printStackTrace();
} 

这里“com.service”是我安装的包名称,“com.service.EnableActivity”是我的第一个应用启动器活动。

日志

java.lang.SecurityException: Permission Denial: attempt to change component state from pid=3354, uid=10056, package uid=10058 at
android.os.Parcel.readException(Parcel.java:1322) at
android.os.Parcel.readException(Parcel.java:1276) at
android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSettingIPackageManager.java:2217)

但是当我使用相同的应用程序包名和类名时,它工作正常。

【问题讨论】:

    标签: android package-managers


    【解决方案1】:

    将此代码添加到您的两个应用程序 mainfest 中。

    <manifest
      .......
      .......
      .......
      android:sharedUserLable="...."
      android:sharedUserID="...">
    

    因为它需要一个相同的用户ID

    这将对您有所帮助。

    【讨论】:

    • 它的工作原理。我想让我的应用程序禁用其他应用程序,但它让我崩溃。权限拒绝:尝试从 pid=30188、uid=10472、包 uid=10091 更改组件状态
    【解决方案2】:

    查看平台我看到以下内容:

    <!-- Allows an application to change whether an application component (other than its own) is
         enabled or not. -->
    <permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"
        android:label="@string/permlab_changeComponentState"
        android:description="@string/permdesc_changeComponentState"
        android:protectionLevel="signatureOrSystem" />
    

    请注意,因为这是“signatureOrSystem”(并且在系统中声明),它只能由使用系统签名签名的应用程序使用,换句话说,您需要是 Android 供应商(HTC、三星、摩托罗拉等)。有关详细信息,请参阅此内容:

    http://developer.android.com/guide/topics/manifest/permission-element.html

    更新:

    Gurjinder Singh Pabla 有正确的答案,如果您尝试更改自己的组件或应用程序的启用状态,那么您需要确保它们具有相同的用户 ID,该用户 ID 在 AndroidManifest 中设置。如果您想禁用其他具有不同用户 ID 的软件包,您只需成为供应商。可以看到Android源码中PackageManagerService.java中的勾选是:

    final int uid = Binder.getCallingUid();
    final int permission = mContext.checkCallingPermission(
                android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
    final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
    
    // ...
    
    if (!allowedByPermission && (uid != pkgSetting.userId)) {
        throw new SecurityException(
            "Permission Denial: attempt to change component state from pid="
            + Binder.getCallingPid()
            + ", uid=" + uid + ", package uid=" + pkgSetting.userId);
    }
    

    【讨论】:

    • "请注意,因为这是 "signatureOrSystem",它只能由 使用系统签名签名的应用程序使用 - 真的吗?阅读您发布的链接
    • 我已经更新了答案,我相信我仍然是正确的,因为它在系统中声明了此特定权限仅适用于系统或使用系统密钥签名的包。
    • 是的 - 添加它会导致错误 - 那么 它不会回答问题 - 如果您必须成为供应商,这有什么好处?您确定没有任何方法可以更改 您的其他应用程序 组件之一的启用状态吗?
    • 抱歉,我错过了重点,您可以更改自己的启用状态 Gurjinder Singh Pabla 有最佳答案。
    • 您还可以从某些 mdm 提供商或直接从例如三星获得 mdm 许可证。开发许可证是免费的。这就是为什么这么多实际工作的包禁用程序至少要花费一美元的真正原因。
    猜你喜欢
    • 2016-12-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多