2010-01-12 7 views
2

je suis revenu au développement widget après mise à niveau vers le dernier SDK et tout à coup mon widget ne au démarrage avec ce message:Android - ne peut pas permettre BroadcastReceiver

ERROR/AndroidRuntime(5296): java.lang.RuntimeException: 
Unable to start receiver topjob.widget.SearchWidget: 
java.lang.SecurityException: Permission Denial: 
attempt to change component state from pid=5296, uid=10057, package uid=10048 

Voici deux lignes de code où exception se produit:

@Override 
public void onEnabled(Context context) { 
    PackageManager pm = context.getPackageManager(); 
    pm.setComponentEnabledSetting(new ComponentName("topjob", 
      ".widget.SearchWidgetBroadcastReceiver"), 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
      PackageManager.DONT_KILL_APP); 
    startAlarm(context, UPDATE_RATE_SEC); 
} 

donc dans le code ci-dessus startAlarm() est jamais exécuté depuis pm.setComponentEnabledSetting() lance le SecurityException

Am Je manque des paramètres de sécurité dans mon manifeste? Actuellement, j'ai:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

Je développe pour SDK v. 1.5 et il l'habitude de travailler bien

post-scriptum Cela se passe sur le téléphone et l'émulateur

+0

Ce comportement est-il limité à des versions de système d'exploitation particulières de l'émulateur? –

+0

Je ne suis pas en cours d'exécution d'émulateur - c'est directement sur le téléphone. Dernier SDK, plugin Eclipse, Java 6 sur Windows XP – Bostone

+0

Une bonne question, bien posée. – jamesh

Répondre

0

OK - ce n'est pas vraiment une réponse mais plutôt une solution de contournement. Si quelqu'un veut intervenir et fournir une réponse ou des explications sur la façon dont cela devrait être fait, je l'accepterais volontiers. En tout cas - Je l'ai eu en travaillant en changeant newState le drapeau de COMPONENT_ENABLED_STATE_ENABLED à PackageManager.COMPONENT_ENABLED_STATE_DEFAULT. Comme mon récepteur de diffusion a activé l'état dans le manifeste cela fonctionne très bien

0

J'ai seulement reçu cette erreur "java.lang.SecurityException: Permission Denial:" quand j'essaye de désactiver un composant hors du paquet dans lequel il s'exécute. Sinon, j'ai eu du succès.

1

Pouvez-vous essayer d'ajouter cette permission dans votre manifeste?

<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> 
+0

Cela ne fonctionnerait que pour une application système, sinon cette autorisation serait refusée. – Tom

3

Au manifest.xml vous ajouterez

<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> 
android:sharedUserId="android.uid.system" 

Au Android.mk ajoutera

LOCAL_CERTIFICATE := platform 

cela est.

+0

Comment cela fonctionne. Ici, dans mon application donne toujours un plantage lorsque je fais une application de désactivation. Permission Denial: tentative de modification de l'état du composant de pid = 32495, uid = 10472, package uid = 10091 –

Questions connexes