Spécialiste de la mise en veille

al33eral33er Membre
22:59 modifié dans API UIKit #1
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.


   

Réponses

  • al33eral33er Membre
    22:59 modifié #2
    Il y a effectivement une instruction spécifique pour la session audio.
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #3
    Tu utilises   [[UIApplication sharedApplication] setIdleTimerDisabled:TRUE]; ?

    [EDIT] Bon, 4h00, il va falloir aller se coucher !
  • al33eral33er Membre
    décembre 2008 modifié #4
    Non je n'utilise pas cette fonction.

    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.

  • Philippe49Philippe49 Membre
    décembre 2008 modifié #5
    Merci pour l'indication,  c'est toujours bon à  savoir. 

    dans 1229632959:

    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 ?


    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

  • al33eral33er Membre
    22:59 modifié #6
    Philippe,

    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.
  • Philippe49Philippe49 Membre
    22:59 modifié #7
    dans 1229725869:

    Philippe,
    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.

    Je n'ai pas ncore essayé, mais ce n'est la property proximitySensingEnabled de UIApplication ?

    dans 1229725869:

    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 ?

    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.
  • al33eral33er Membre
    décembre 2008 modifié #8
    merci philippe,

    J'ai essayé et ça marche.

    Y a t-il maintenant un moyen de simuler l'événement "approchage" de la joue ?

    Alexandre. 
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #9
    Pour avancer, on pourrait découper la question :
    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
  • al33eral33er Membre
    22:59 modifié #10
    Pour essayer de te suivre le LOGCMD sert à  quoi exactement : enregistrer les événements c'est ça  ? et pourquoi executer deux fois le uievent ?

  • Philippe49Philippe49 Membre
    décembre 2008 modifié #11
    dans 1229762064:

    Pour essayer de te suivre le LOGCMD sert à  quoi exactement :

    LOGCMD fait une macro perso qui logue le nom de la méthode qui s'exécute.

    dans 1229762064:

    enregistrer les événements c'est ça  ? et pourquoi executer deux fois le uievent ?

    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.
  • al33eral33er Membre
    22:59 modifié #12
    Ok je vais chercher si quelque part sur internet je peux trouver la liste des événements de l'iphone.
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #14
    dans 1229759280:

    @implementation MyApplication
    -(id) init {
    LOGCMD;
    return self=[super init];
    }
    - (void)sendEvent:(UIEvent *)event {
    LOGCMD;
    [super sendEvent:event];
    [super sendEvent:event]; // Là  ça coince dur !!
    }
    @end


    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];
    }
    }


  • al33eral33er Membre
    22:59 modifié #15
    tu progresses ?
  • Philippe49Philippe49 Membre
    22:59 modifié #16
    J'essaie de réaliser la copie d'un UIEvent, et donc celle d'un UITouch.
  • al33eral33er Membre
    22:59 modifié #17
    Ok

    Moi j'essaye d'uiliser le code de MATT. Je suis un peu sec avec la programmation COCOA, c'est pas facile.

    Alexandre. 
  • Philippe49Philippe49 Membre
    22:59 modifié #18
    dans 1229772201:

    J'essaie de réaliser la copie d'un UIEvent, et donc celle d'un UITouch.

    Bon ben la copie est faite, presque bien, mais pour la mettre sur la pile c'est autre chose ...
  • al33eral33er Membre
    22:59 modifié #19
    Cool  tu es sur la bonne voix
  • al33eral33er Membre
    décembre 2008 modifié #20
    Moi j'ai essayé de comprendre la différence entre le Firmware 2.2 et le firmware 2.1 et j'ai trouvé qu'il y avait des différences sur le powermanagement.bundle.

    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. 


  • Philippe49Philippe49 Membre
    22:59 modifié #21
    Pour faire exécuter un événement par programme, cela semble passer par l'envoi
    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.
Connectez-vous ou Inscrivez-vous pour répondre.