1

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

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

这是我使用的代码。

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)

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

4

2 回答 2

2

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

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

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

这将对您有所帮助。

于 2013-04-04T11:59:24.307 回答
0

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

<!-- 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 的软件包,您只需成为供应商。在PackageManagerService.java中可以看到Android源码中的检查是:

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);
}
于 2012-10-02T20:20:46.870 回答