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

Reply via email to