Question

j'essaie d'implémenter un WakeLock dans mon application Android.J'ai le code suivant dans mon onCreat() :

pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
myWakeLock = pm.newWakeLock(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,"WakeLock for Tuner");

La deuxième ligne menant à un crash.Il lève une exception fatale.Pour autant que je sache, Android dit que le premier argument n'est pas un niveau de wakelock valide.Mais sur le site du développeur, il est recommandé d'utiliser FLAG_KEEP_SCREEN_ON donc je suis un peu confus (http://developer.android.com/reference/android/os/PowerManager.html#newWakeLock%28int,%20java.lang.String%29)

Dois-je utiliser le PowerManager.FULL_WAKE_LOCK obsolète ?

Le code suivant, comme suggéré dans la question Comment faire fonctionner un Android WakeLock ? , ce n'est pas la bonne façon à mon avis.

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Je n'ai pas besoin d'une application Wakeup pour le trou.L'application est un accordeur pour instruments et ne doit rester éveillée que lorsque l'accordeur est en cours d'exécution.Le plan est d'appeler myWakeLock.acquire() dans la méthode startTuner() et myWakeLock.release() analogique dans la méthode stopTuner().Je ne sais pas comment réaliser cela avec la manière suggérée.

Voici le message d'exception complet :

04-13 19:21:14.815: E/AndroidRuntime(9452): FATAL EXCEPTION: main
04-13 19:21:14.815: E/AndroidRuntime(9452): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.benediktbock.ffttest/de.benediktbock.ffttest.MainActivity}: java.lang.IllegalArgumentException: Must specify a valid wake lock level.
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2249)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.access$700(ActivityThread.java:154)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.Looper.loop(Looper.java:137)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.main(ActivityThread.java:5306)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at java.lang.reflect.Method.invoke(Method.java:511)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at dalvik.system.NativeStart.main(Native Method)
04-13 19:21:14.815: E/AndroidRuntime(9452): Caused by: java.lang.IllegalArgumentException: Must specify a valid wake lock level.
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.PowerManager.validateWakeLockParameters(PowerManager.java:488)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.os.PowerManager.newWakeLock(PowerManager.java:474)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at de.benediktbock.ffttest.MainActivity.onCreate(MainActivity.java:62)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.Activity.performCreate(Activity.java:5255)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
04-13 19:21:14.815: E/AndroidRuntime(9452):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
04-13 19:21:14.815: E/AndroidRuntime(9452):     ... 11 more
Était-ce utile?

La solution

Mais sur le site développeur, il est recommandé d'utiliser FLAG_KEEP_SCREEN_ON

Cela fait référence à un alternative à l'utilisation WakeLock, si votre objectif est simplement de garder l'écran allumé pendant qu'une partie de votre interface utilisateur est au premier plan.

Dois-je utiliser le PowerManager.FULL_WAKE_LOCK obsolète ?

Cela dépend de ce que vous essayez de faire.Vous devez utiliser une de ces constantes sur PowerManager dans newWakeLock().

L'application est un accordeur pour instruments et ne doit rester éveillée que lorsque l'accordeur est en cours d'exécution.Le plan est d'appeler myWakeLock.acquire() dans la méthode startTuner() et myWakeLock.release() analogique dans la méthode stopTuner().Je ne sais pas comment réaliser cela avec la manière suggérée.

Appel setKeepScreenOn(true) sur quelques View dans l'interface utilisateur de votre tuner lorsque vous souhaitez garder l'écran éveillé.Appel setKeepScreenOn(false) sur quelques View dans l'interface utilisateur de votre tuner lorsque vous souhaitez que le comportement normal de l'écran reprenne.Entre ces appels, tant que l'interface utilisateur de votre tuner est au premier plan, l'écran ne s'éteindra pas.En prime, vous n'avez pas besoin du WAKE_LOCK autorisation.

Autres conseils

int PROXIMITY_WAKE_LOCK = 32;
PowerManager mgr=(PowerManager) getSystemService(Context.POWER_SERVICE);
proximityWakeLock = mgr.newWakeLock(PROXIMITY_WAKE_LOCK, "Beam");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top