Как узнать, что пользователи нажимают кнопки быстрой перемотки вперед и назад на элементах управления воспроизведением в iPhone?
Я хочу реализовать следующие вещи,
- Приложение запускает музыку или видео (используя
MPMoviePlayerController
) в фоновом режиме. - Пользователь дважды щелкает кнопку "Домой" и переходит к первому экрану, показывающему элементы управления воспроизведением (быстрая перемотка назад, воспроизведение или пауза, кнопки ускоренной перемотки вперед)
- Пользователь нажимает кнопку быстрой перемотки назад или вперед. Затем приложение воспроизводит предыдущую или следующую музыку или видео.
Для третьего шага я должен знать, какая кнопка нажата.
(Как я естественно знаю, что воспроизводимый в данный момент элемент приостановлен, остановлен.. с помощью MPMoviePlayerPlaybackStateDidChangeNotification
уведомление).
Какое уведомление я должен зарегистрировать? Или есть другие подходы?
2 ответа
Я получил ответ сам.
Это с помощью beginReceivingRemoteControlEvents UIApplication.
В соответствующем месте (например, viewWillAppear:) поместите следующий код
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
И контроллер представления должен реализовать следующий метод, возвращающий YES
- (BOOL)canBecomeFirstResponder {
return YES;
}
И тогда вы можете получить событие удаленного контроллера следующим способом.
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
if( event.type == UIEventTypeRemoteControl ) {
NSLog(@"sub type: %d", event.subtype);
}
}
И event.subtype, как показано ниже,
typedef enum {
// available in iPhone OS 3.0
UIEventSubtypeNone = 0,
// for UIEventTypeMotion, available in iPhone OS 3.0
UIEventSubtypeMotionShake = 1,
// for UIEventTypeRemoteControl, available in iPhone OS 4.0
UIEventSubtypeRemoteControlPlay = 100,
UIEventSubtypeRemoteControlPause = 101,
UIEventSubtypeRemoteControlStop = 102,
UIEventSubtypeRemoteControlTogglePlayPause = 103,
UIEventSubtypeRemoteControlNextTrack = 104,
UIEventSubtypeRemoteControlPreviousTrack = 105,
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
UIEventSubtypeRemoteControlEndSeekingBackward = 107,
UIEventSubtypeRemoteControlBeginSeekingForward = 108,
UIEventSubtypeRemoteControlEndSeekingForward = 109,
} UIEventSubtype;
Это может быть очень поздний ответ, но, как я заметил, вопросов о воспроизведении звука и пультах дистанционного управления не так много, поэтому я надеюсь, что мой ответ поможет другим, у которых возникла такая же проблема:
я использую AVAudioPlayer
на данный момент, но метод дистанционного управления, который - (void)remoteControlReceivedWithEvent:(UIEvent *)event
не должен быть связан с типом игрока, который вы используете.
Чтобы получить кнопки "вперед" и "назад" на экране блокировки, выполните следующие действия:
По вашему мнению, контроллер viewDidLoad
Метод добавить следующий код:
//Make sure the system follows our playback status - to support the playback when the app enters the background mode.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
Затем добавьте эти методы: viewDidAppear:
: (если не реализовано уже)
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//Once the view has loaded then we can register to begin recieving controls and we can become the first responder
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
}
viewWillDisappear:
(если не реализовано уже)
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
//End recieving events
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
[self resignFirstResponder];
}
А также:
//Make sure we can recieve remote control events
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
//if it is a remote control event handle it correctly
if (event.type == UIEventTypeRemoteControl)
{
if (event.subtype == UIEventSubtypeRemoteControlPlay)
{
[self playAudio];
}
else if (event.subtype == UIEventSubtypeRemoteControlPause)
{
[self pauseAudio];
}
else if (event.subtype == UIEventSubtypeRemoteControlTogglePlayPause)
{
[self togglePlayPause];
}
else if (event.subtype == UIEventSubtypeRemoteControlBeginSeekingBackward)
{
[self rewindTheAudio]; //You must implement 15" rewinding in this method.
}
else if (event.subtype == UIEventSubtypeRemoteControlBeginSeekingForward)
{
[self fastForwardTheAudio]; //You must implement 15" fastforwarding in this method.
}
}
}
Это нормально работает в моем приложении, однако, если вы хотите иметь возможность получать события удаленного управления во всех контроллерах представления, то вы должны установить его в AppDelegate
,
НОТА! В данный момент этот код работает нормально, но я вижу еще два подтипа UIEventSubtypeRemoteControlEndSeekingBackward
а также UIEventSubtypeRemoteControlEndSeekingBackward
, Я не уверен, должны ли они быть реализованы или нет, если кто-то знает об этом, дайте нам знать.