Spécialiste de la mise en veille
Bonjour,
Je suis en train de faire une application qui lit un fichier audio mp3 sur un site. Cela marche très bien.
JE lit bien le fichier, la musique passe bien.
J'ai un problème depuis la mise à jour du 2.2 du firmware. En fait depuis ce moment, pendant la lecture de mon stream, la mise en veille arrete la lecture du stream. Cela ne le faisait pas en 2.1. Quand je déverrouille, la lecture reprend là ou elle a été arrété.
Y-a-il un paramètre qui permettrait de laisser le stream se lire sans couper au moyen de la mise en veille.
Apparement sur l'application ipod cela se fait, ainsi que sur l'application liveradio de orange.
Je vous remercie pour votre aide.
Alexandre.
Je suis en train de faire une application qui lit un fichier audio mp3 sur un site. Cela marche très bien.
JE lit bien le fichier, la musique passe bien.
J'ai un problème depuis la mise à jour du 2.2 du firmware. En fait depuis ce moment, pendant la lecture de mon stream, la mise en veille arrete la lecture du stream. Cela ne le faisait pas en 2.1. Quand je déverrouille, la lecture reprend là ou elle a été arrété.
Y-a-il un paramètre qui permettrait de laisser le stream se lire sans couper au moyen de la mise en veille.
Apparement sur l'application ipod cela se fait, ainsi que sur l'application liveradio de orange.
Je vous remercie pour votre aide.
Alexandre.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
[EDIT] Bon, 4h00, il va falloir aller se coucher !
Il y en a une spéciale pour les session audios.
//
// Set the audio session category so that we continue to play if the
// iPhone/iPod auto-locks.
//
AudioSessionInitialize (
NULL, // 'NULL' to use the default (main) run loop
NULL, // 'NULL' to use the default run loop mode
MyAudioSessionInterruptionListener, // a reference to your interruption callback
self // data to pass to your interruption listener callback
);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (
kAudioSessionProperty_AudioCategory,
sizeof (sessionCategory),
&sessionCategory
);
AudioSessionSetActive(true);
Par contre je cherche la même chose pour les NSTIMER.
En effet, depuis le firmware 2.2, apple a changé son mode de gestion de l'alimentation. Avant les timers avec Firedate n'était pas affecté par la veille, maintenant ils le sont. C'est galère pour le genre d'appli que je fait.
J'ai donc deux questions :
- peut-on éteindre et allumer l'écran ?
- peut on modifier en live les paramètre d'alimentation stocké dans le bundle ?
C'est les deux seules pistes que je vois pour régler mon problème.
Alex.
Pour la modification du bundle, on a accès au répertoire <Appli Home>/Documents/ de l'application. Par la stratégie suivante :
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * preferencesPath=[[paths objectAtIndex:0] stringByAppendingPathComponent:@Preferences.plist];
NSFileManager * defaultFileManager=[NSFileManager defaultManager];
if([defaultFileManager fileExistsAtPath:preferencesPath]) {
       ....
       [preferences writeToFile:preferencesPath atomically:YES];
Evidemment, les Settings sont aussi disponibles via NSUserdefaults, mais c'est autre chose.
On peut atteindre aussi <Appl Home>/Library/Caches et <Appl Home>/tmp
Tu ne connaà®trais pas par hasard la façon d'éteindre l'écran comme quand on téléphone. Lorsque l'on approche l'écran de la joue, il s'éteint lors que l'éloigne il se rallume.
Pour détecter le mouvement c'est l'accélérometre, il y a une fonction pour la sensibilité, je pense que cela tourne autour du touch mais pour eteindre et allumer l'écran je n'ai rien trouvé. Tu n'as pas une idée ? ou Quelqu'un d'autre peut être ?
Cordialement.
Alexandre.
Je n'ai pas ncore essayé, mais ce n'est la property proximitySensingEnabled de UIApplication ?
J'ai regardé sur le developper-forum, j'ai rien vu. ou plutôt si : que la possibilité pour une application de mettre en veille risquerait de perturber le fonctionnement standard de l'iphone.
J'ai essayé et ça marche.
Y a t-il maintenant un moyen de simuler l'événement "approchage" de la joue ?
Alexandre.
1) Comment peut-on par programme faire exécuter deux fois le même UIEvent ?
2) Comment créer un événement UIEvent, par copie par exemple, sans l'intervention de l'utilisateur et faire convenablement le sendEvent .
3) Comment créer un événement UIEvent sans copie
4) Quelles sont les caractéristiques de l'événement "approche"
La question 1) me dirige vers comment sous-classer UIApplication et faire quelque chose comme cela :
@implementation MyApplication
-(id) init {
LOGCMD;
return self=[super init];
}
- (void)sendEvent:(UIEvent *)event {
LOGCMD;
[super sendEvent:event];
[super sendEvent:event]; // Là ça coince dur !! et il faudra maitriser la récursion
}
@end
LOGCMD fait une macro perso qui logue le nom de la méthode qui s'exécute.
Il faut pouvoir créer un événement et le faire exécuter.
J'essaie d'abord de faire exécuter une seconde fois un événement provoqué par l'utilisateur.
Comme je n'ai pas trouvé l'accès à la pile des événements "event queue" (cela doit être possible via des méthodes non documentées) j'essaye de voir si on peut utiliser les méthodes officielles.
Après il faudra s'occuper de la création d'un événement par programme.
en mieux, cela ne plante plus, mais cela ne double pas non plus l'action :
- (void)sendEvent:(UIEvent *)event {
if(nil!=[event touchesForWindow:self.keyWindow]) {
fprintf(stderr,"... touches for window\n");
[event retain];
[super sendEvent:event];
[super sendEvent:event]; // récursion à voir ...
[event release];
} else {
fprintf(stderr,"... other event\n");
[super sendEvent:event];
}
}
Moi j'essaye d'uiliser le code de MATT. Je suis un peu sec avec la programmation COCOA, c'est pas facile.
Alexandre.
Bon ben la copie est faite, presque bien, mais pour la mettre sur la pile c'est autre chose ...
En effet, il y a 5 choix possibles de gestion de l'économie d'énergie quand on est sur AC, Battery et UPS.
Pour chacun de ces types, dans le bundle on peut choisir 1 type de configuration parmi 5.
Sur l'aspect battery, ce qui me pose probléme, c'est le mode 5 qui fonctionne (alors que c'est le 1 de paramétré).
Maintenant comment faire pour que les utilisateurs de mon appli puissent régler ce paramètre ? ce n'est pas accessible par les réglages de l'iphone.
Je vais essayé avec le code de philippe49.
Alexandre.
id touches=[event allTouches];
UITouch * touch=[touches anyObject];
[touch.view touchesBegan:touches withEvent:event];
[event changeToPhase:UITouchPhaseEnded];
[touch.view touchesEnded:touches withEvent:event];
- Pour changeToPhase: on peut définir la méthode dans une catégorie sur UIEvent qui itère l'appel à une méthode sur une méthode de UITouch, elle aussi définie dans une catégorie.
- cela fonctionne avec UIControlEventTouchUpInside. Il faut éventuellement adapter dans le cas d'autres control event.