2010-09-28 5 views
2

J'essaie d'acquérir un verrou de sillage mais quand j'appelle PowerManager.newWakeLock(), je reçois une exception IlleglArgumentException.PowerManager.newWakeLock() lance IlleagelArgumentException

Voici le code que j'utilise pour obtenir le

private void setWakeLock(Context context) 
{ 
    PowerManager pm = (PowerManager) context 
    .getSystemService(Context.POWER_SERVICE); 
    SoundAlarmActivity.WakeLock = pm.newWakeLock(
    PowerManager.ACQUIRE_CAUSES_WAKEUP 
      | PowerManager.ON_AFTER_RELEASE, "Alarm"); 
    SoundAlarmActivity.WakeLock.acquire(); 
} 

Et voici le logcat:

09-28 12:53:09.704: ERROR/AndroidRuntime(702): java.lang.IllegalArgumentException 
09-28 12:53:09.704: ERROR/AndroidRuntime(702):  at android.os.PowerManager$WakeLock.<init>(PowerManager.java:223) 
09-28 12:53:09.704: ERROR/AndroidRuntime(702):  at android.os.PowerManager.newWakeLock(PowerManager.java:365) 

Répondre

14

Essayez ceci:

private void setWakeLock(Context context) 
{ 
    PowerManager pm = (PowerManager) context 
    .getSystemService(Context.POWER_SERVICE); 
    SoundAlarmActivity.WakeLock = pm.newWakeLock(
    PowerManager.FULL_WAKE_LOCK | 
     PowerManager.ACQUIRE_CAUSES_WAKEUP 
      | PowerManager.ON_AFTER_RELEASE, "BusSnoozeAlarm"); 
    SoundAlarmActivity.WakeLock.acquire(); 
} 

PowerManager.ACQUIRE_CAUSES_WAKEUP ne fonctionne pas avec verrous de sillage partiel, vous devez donc vous assurer que vous utilisez un FULL_WAKE_LOCK lors de la définition du type de Wake Lo ck tu veux.

+0

Je vous remercie beaucoup , J'ai essayé tant de choses et votre solution fonctionne;) – IgorOliveira

+0

Merci. Cela a fonctionné pour moi –

+0

Est-ce que le verrou de sillage complet n'est pas déprécié? Comment puis-je obtenir le même comportement sans cela? – Sandra

6

Vous devez définir quel "type" de verrou de sillage vous voulez. Les deux drapeaux que vous donnez ne sont que des ajouts au niveau:

[WakeLock level] Flag Value | CPU | Screen | Keyboard 
----------------------------------------------------- 
PARTIAL_WAKE_LOCK   | On* | Off | Off 
SCREEN_DIM_WAKE_LOCK  | On | Dim | Off 
SCREEN_BRIGHT_WAKE_LOCK  | On | Bright | Off 
FULL_WAKE_LOCK    | On | Bright | Bright 

Note: Au niveau de l'API 17, à l'exception PARTIAL_WAKE_LOCK, d'autres niveaux de wakelock sont déconseillés, au lieu, vous devez utiliser LayoutParams.FLAG_KEEP_SCREEN_ON

+3

Sachez cependant que ACQUIRE_CAUSES_WAKEUP ne fonctionnera pas avec un PARTIAL_WAKE_LOCK. –

+0

Alors laissez-moi comprendre. Si ACQUIRE_CAUSES_WAKEUP ne peut pas être utilisé seul, vous devez définir le «type» de verrou de sillage souhaité et, dans le cas contraire, vous obtenez une exception indiquant «Vous devez spécifier un niveau de verrouillage de sillage valide». Vous devez donc en choisir un dans la liste des niveaux de WakeLock. Mais, SCREEN_DIM_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK et FULL_WAKE_LOCK sont obsolètes, et vous dites ok, il en reste une de plus. Et puis ... vous vous rendez compte que le seul qui n'est pas obsolète, vous ne pouvez pas l'utiliser avec. Alors, y a-t-il une manière correcte de faire cela? FULL_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP fonctionne très bien – Sandra

Questions connexes