31 votes

iOS 4: télécommandes pour l'audio d'arrière-plan

Je suis en train d'essayer de définir l'arrière-plan audio pour une application que je suis en développement pour iOS 4. L'application ne dispose pas d'un lecteur de musique dédié viewController, cependant, contrairement à d'autres applications audio telles que Pandora, ce qui rend la tâche un peu plus de confusion.

J'ai mis l'appropriées Info.plist paramètres correctement et avoir un AVAudioPlayer objet dans mon délégué d'application qui est accessible de partout. Lorsque l'utilisateur joue un morceau, j'ai remplacer l' AVAudioPlayer avec un nouveau initialisé avec la chanson et de la jouer. Tout cela fonctionne très bien, sauf que maintenant je n'ai aucune idée de la façon d'aller sur l'appui de contrôle à distance des événements.

Basé sur la documentation d'Apple, j'ai ceci:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    switch(event.subtype) {
        case UIEventSubtypeRemoteControlTogglePlayPause:
            if([iPhoneAppDelegate backgroundAudioPlayer].playing)
                [iPhoneAppDelegate pauseBackgroundAudioPlayer];
            else
                [iPhoneAppDelegate playBackgroundAudioPlayer];
            break;
    }
}

La chose est, où dois-je placer ce? La documentation d'Apple semble suggérer que cela devrait aller, dans certains view controller quelque part, mais mon application a beaucoup de vue, les contrôleurs et les contrôleurs de la navigation. Où que j'essaie de mettre ce, pour quelque raison appuyant sur l'onglet bouton lecture/Pause dans le plateau multi-tâches de commandes à distance, soit à cause de la chanson juste une pause pour un moment, puis reprendre, ou en quelque sorte causes de la chanson à jouer deux fois.

37voto

Les exemples de documentation sont un peu trompeurs, mais il n'est pas nécessaire de sous-classer quoi que ce soit. L'endroit correct pour placer remoteControlReceivedWithEvent: se trouve dans le délégué d'application, car il reste dans la chaîne de répondeur, que l'application soit au premier plan ou non. De plus, le début / fin de la réception des événements de contrôle à distance doit être basé sur le fait que vous ayez réellement besoin des événements, et non sur la visibilité d'une vue aléatoire.

19voto

Anshu Chimala Points 1924

J'ai trouvé un couple de solutions de recevoir global de contrôle à distance des événements sur les Forums des Développeurs Apple, après un peu de recherche.

Une façon est de la sous-classe UIWindow et de remplacer son remoteControlReceivedWithEvent:.

La deuxième, peut-être plus agréable est pour sous - UIApplication et remplacer sendEvent:. De cette façon, vous pouvez intercepter tout le contrôle à distance des événements et à les gérer de là à l'échelle mondiale, et pas des autres intervenants de la poignée plus tard dans le répondeur de la chaîne.

- (void)sendEvent:(UIEvent *)event {
     if (event.type == UIEventTypeRemoteControl) {
          // Handle event
     }
     else
          [super sendEvent:event];
}

4voto

Stelian Iancu Points 1168

La deuxième méthode n'a pas fonctionné pour moi, sendEvent n'a jamais été appelée. Cependant, la première méthode a très bien fonctionné (sous-classement UIWindow ).

3voto

Sherwin Zadeh Points 153

J'ai eu du mal avec celui-ci pendant un certain temps et aucune des réponses ci-dessus n'a fonctionné. Le bogue dans mon code, et j'espère que cela aidera quelqu'un à lire ceci, était que j'avais le jeu AudioSession à mélanger avec les autres. Vous voulez être le lecteur audio de premier plan pour obtenir des événements de contrôle à distance. Vérifiez si vous avez un code INCORRECT comme celui-ci:

     [[AVAudioSession sharedInstance] setDelegate: self];
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
    UInt32 doSetProperty = 0;
    AudioSessionSetProperty (
                             kAudioSessionProperty_OverrideCategoryMixWithOthers,
                             sizeof (doSetProperty),
                             &doSetProperty
                             );
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];       
 

Et supprimez AudioSessionSetProperty ou remplacez doSetProperty par 1.

0voto

slf Points 15327

Pas besoin de sous-classer la fenêtre ou de transmettre des événements. Manipulez-le simplement depuis votre contrôleur de vue principal. Voir l'exemple Mixer Audio (MixerHost) pour plus de détails.

http://developer.apple.com/LIBRARY/IOS/#samplecode/MixerHost/Listings/Classes_MixerHostViewController_m.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X