Android PackageManager включить любое приложение - PullRequest
1 голос
/ 09 декабря 2011

Я разработал приложение, в котором я включил, что любое имеющееся у нас приложение может быть установлено вручную

Но моя проблема в том, что я хочу включить только собственное имя пакета, а не любое другое имя пакета приложения.

Вот код, который я использовал.

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)

Но когда я использую одно и то же имя пакета приложения и имя класса, он работает нормально.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2013

Добавьте этот код в mainfest вашего приложения.

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

потому что нужен идентификатор пользователя, который будет таким же

Это тебе поможет.

0 голосов
/ 03 октября 2012

Глядя на платформу, я вижу следующее:

<!-- 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, Samsung, Motorola и т. д.).См. Это для получения дополнительной информации:

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

ОБНОВЛЕНИЕ:

Гурджиндер Сингх Пабла имеет правильный ответ, если вы пытаетесь изменитьвключите состояние ваших собственных компонентов или приложений, тогда вам нужно убедиться, что они имеют одинаковый идентификатор пользователя, который установлен в AndroidManifest.Вам нужно быть Продавцом, только если вы хотите отключить другие пакеты, которые имеют разные идентификаторы пользователей.Вы можете увидеть проверку в источнике 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);
}
...