But an application should be able to use setComponentEnabledSetting on it's own activities or other components.Suppose an application has 2 launcher panel activities but after getting user data , it disables one of activities so that it is not shown in launcher panel again. i think such type of action should be perfectly legal.
On Thu, Nov 12, 2009 at 3:03 PM, Dianne Hackborn <[email protected]>wrote: > Third party applications can not be granted CHANGE_COMPONENT_ENABLED_STATE, > since that would allow them to break or otherwise mess with other > applications. > > > On Wed, Jun 17, 2009 at 3:29 PM, erictcrook <[email protected]> wrote: > >> Ok, so, I am unable to use setComponentEnable. >> >> I apologize for the long post, I am trying to include all the helpful info >> here. >> >> ComponentName componentName = >> *new* ComponentName("com.ericcrook.disabletest", >> "com.ericcrook.disabletest.DisableActivity.class"); >> >> pm.setComponentEnabledSetting(componentName, PackageManager. >> *COMPONENT_ENABLED_STATE_DISABLED*, PackageManager.*DONT_KILL_APP*); >> >> If the ComponentName points to this class, it runs without error, however >> the icon is still displayed in the Applications Drawer. >> >> If ComponentName points to another class in another package, it throws >> this >> >> 06-17 16:13:18.075: ERROR/AndroidRuntime(2026): Caused by: >> java.lang.SecurityException: Permission Denial: attempt to change component >> state from pid=2026, uid=10004, package uid=10032 >> 06-17 16:13:18.075: ERROR/AndroidRuntime(2026): at >> android.os.Parcel.readException(Parcel.java:1234) >> 06-17 16:13:18.075: ERROR/AndroidRuntime(2026): at >> android.os.Parcel.readException(Parcel.java:1222) >> 06-17 16:13:18.075: ERROR/AndroidRuntime(2026): at >> android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSetting(IPackageManager.java:1823) >> 06-17 16:13:18.075: ERROR/AndroidRuntime(2026): at >> android.app.ApplicationContext$ApplicationPackageManager.setComponentEnabledSetting(ApplicationContext.java:2421) >> >> >> Looking at the source found at: >> >> http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=services/java/com/android/server/PackageManagerService.java;h=1f3ec2bd1f7e93655b10270b8691726de8ead421;hb=cupcake >> on line 4461 >> >> this line appears: >> >> final int permission = >> mContext.checkCallingPermission(android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); >> >> This is later checked at line 4475: >> 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); >> } >> >> The weird thing about all this is, when I set >> >> <uses-permission android:name=* >> "android.permission.CHANGE_COMPONENT_ENABLED_STATE"* /> >> >> as a child of Manifest, when I install the app, it says, "No permissions >> required" >> If I request other permissions, they show up appropriately during install. >> I don't fully understand the uid check here, but I am looking into it. >> Thanks, >> Eric Crook >> >> n Wed, Jun 17, 2009 at 10:08 AM, Romain Guy <[email protected]> wrote: >> >>> >>> Launcher is the name of the application also called Home. So Home == >>> Launcher and Launcher == Home. >>> >>> UNINSTALL_SHORTCUT can *only* be used to uninstall a shortcut from the >>> workspace (or desktop). Icons in the applications drawer can only be >>> uninstalled by either disabling the activities or uninstalling >>> packages via the PackageManager. >>> >>> > /*I explicitly send my intent to the launcher app. I only knew to do >>> this >>> > by looking >>> > at the source code I found here: >>> > >>> http://android.git.kernel.org/?p=platform/packages/apps/Launcher.git;a=blob;f=src/com/android/launcher/UninstallShortcutReceiver.java;h=e490f9c0f59e609ba70d82a8093c950285865267;hb=cupcake >>> > */ >>> > intent.setComponent( >>> > >>> > new ComponentName("com.android.launcher", >>> > "com.android.launcher.UninstallShortcutReceiver")); >>> >>> There's absolutely no need to do this. All you need to do is set the >>> action to com.android.launcher.permission.UNINSTALL_SHORTCUT. >>> >>> -- >>> Romain Guy >>> Android framework engineer >>> [email protected] >>> >>> Note: please don't send private questions to me, as I don't have time >>> to provide private support. All such questions should be posted on >>> public forums, where I and others can see and answer them >>> --~--~---------~--~----~------------~-------~--~----~ >>> You received this message because you are subscribed to the Google >>> Groups "Android Developers" group. >>> To post to this group, send email to [email protected] >>> To unsubscribe from this group, send email to >>> [email protected] >>> For more options, visit this group at >>> http://groups.google.com/group/android-developers?hl=en >>> -~----------~----~----~----~------~----~------~--~--- >>> >>> > > > -- > Dianne Hackborn > Android framework engineer > [email protected] > > Note: please don't send private questions to me, as I don't have time to > provide private support, and so won't reply to such e-mails. All such > questions should be posted on public forums, where I and others can see and > answer them. > > > -- > You received this message because you are subscribed to the Google > Groups "Android Developers" group. > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected]<android-developers%[email protected]> > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

