2013-09-11 2 views
7

Я не нашел способ перемотки песни с экрана блокировки iOS 7. Доступен ползунок громкости, все кнопки работают правильно, но верхний слайдер недоступен!iOS 7 перематывает песни на экран блокировки с помощью AVPlayer

AVPlayer - это класс, который я использую.

Любая помощь приветствуется!

ответ

11

Вам необходимо установить это в «текущей информации».

Всякий раз, когда пункт (трек) изменения, сделать что-то вроде

NSMutableDictionary *nowPlayingInfo = [[NSMutableDictionary alloc] init]; 
[nowPlayingInfo setObject:track.artistName forKey:MPMediaItemPropertyArtist]; 
[nowPlayingInfo setObject:track.trackTitle forKey:MPMediaItemPropertyTitle]; 
... 
[nowPlayingInfo setObject:[NSNumber numberWithDouble:self.player.rate] forKey:MPNowPlayingInfoPropertyPlaybackRate]; 
[nowPlayingInfo setObject:[NSNumber numberWithDouble:self.currentPlaybackTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; 
[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = nowPlayingInfo; 

Всякий раз, когда изменяется скорость воспроизведения (воспроизведение/пауза), сделать

NSMutableDictionary *nowPlayingInfo = [[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo mutableCopy]; 
[nowPlayingInfo setObject:[NSNumber numberWithDouble:self.player.rate] forKey:MPNowPlayingInfoPropertyPlaybackRate]; 
[nowPlayingInfo setObject:[NSNumber numberWithDouble:self.currentPlaybackTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; 
[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = nowPlayingInfo; 

Вы можете получить текущее время воспроизведения, как это :

- (NSTimeInterval)currentPlaybackTime { 
    CMTime time = self.player.currentTime; 
    if (CMTIME_IS_VALID(time)) { 
    return time.value/time.timescale; 
    } 
    return 0; 
} 
+0

Это потому что если вы U петь MediaPlayer, они используют AVPlayer. – daidai

+3

'MPNowplayingInfo' может использоваться с любым игроком. Выполняем это с помощью 'AVPlayer'. – chris

+0

Ой, я этого не осознавал - спасибо. – daidai

1

Я не могу найти способ добавить функциональность перетаскивания програ ss bar, чтобы скрасить текущую воспроизводимую песню, однако, чтобы показать индикатор выполнения, частично покрывается Крисом выше, но вы должны передать продолжительность песни и другую информацию, чтобы отобразить индикатор выполнения. Таким образом, в дополнение к тому, что Крис отметил, что вам нужно добавить следующее в NSMutableDictionary:

[nowPlayingInfo setObject:[track valueForProperty: MPMediaItemPropertyPlaybackDuration] 
        forKey:MPMediaItemPropertyPlaybackDuration]; 

Кроме того, вы можете обрабатывать длительное нажатие кнопок вперед и назад и прокручивать музыку. В:

- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent 

вы можете посмотреть на эти подтипы событий:

if (receivedEvent.subtype == UIEventSubtypeRemoteControlBeginSeekingBackward){}; 
if (receivedEvent.subtype == UIEventSubtypeRemoteControlBeginSeekingForward){}; 
if (receivedEvent.subtype == UIEventSubtypeRemoteControlEndSeekingBackward){}; 
if (receivedEvent.subtype == UIEventSubtypeRemoteControlEndSeekingForward){}; 

BeginSeekingForward и BeginSeekingBackward вызваны длительными нажатиями кнопок вперед и назад, соответственно, и, конечно, EndSeekingForward и EndSeekingBackward события Подтипы - это когда палец снят с кнопки.

Когда вы получите эти подтипы событий, принять новый NSDictionary к

[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo 

со всей информацией, которая уже была в нем (в противном случае свойства, которые не проходят будут удалены) плюс новый MPNowPlayingInfoPropertyElapsedPlaybackTime и MPNowPlayingInfoPropertyPlaybackRate. Для скорости вы определяете, как быстро вы хотите прокручивать аудио. 1 - нормальная скорость, отрицательные значения - в обратном направлении, так что -2 - 2x нормальная скорость в обратном направлении. Вам необходимо будет установить скорость воспроизведения MPNowPlayingInfoCenter так же, как скорость воспроизведения AVPlayer, или они не будут выстраиваться в линию. Вот почему вы хотите также пройти в текущее время. Вы можете получить это с:

[player currentTime] 

так, чтобы установить текущее время и скорость:

[nowPlayingInfo setObject:[player currentTime] 
        forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; 
[nowPlayingInfo setObject:[[NSNumber alloc] initWithFloat:10] 
        forKey:MPNowPlayingInfoPropertyPlaybackRate]; 

и установить скорость игрока с:

[player setRate:10] 

Это должно выстраиваться как игрок и индикатор выполнения, прокручивая с 10-кратной скоростью прокрутки вперед.Таким образом, вы сделаете это, когда получите подтип события BeginSeekingForward. Когда прокрутка заканчивается, установите скорость обратно в одну, но все же передавайте время и другую информацию в информационный центр. Для BeginSeekingBackward просто используйте отрицательное число для ставки.

Я знаю, что это старый пост, но не было хорошего решения, и я наткнулся на эту тему, ища, как получить информацию о музыке на экране блокировки. Я пытался реализовать эту функциональность на C# с Xamarin iOS и нашел хороший справочник и пример Objective-C с некоторыми из этих функций на http://www.sagorin.org/ios-playing-audio-in-background-audio/. Но у него не было функциональных возможностей прокрутки, и он не использовал информационный центр, он просто закрыл обработку паузы/воспроизведения с экрана блокировки. Я сделал пример приложения на C# с Xamarin, который демонстрирует предоставление информации в информационный центр и прокрутку с помощью кнопок «назад» и «вперед» с экранов блокировки и управления, которые вы можете получить здесь: https://github.com/jgold6/Xamarin-iOS-LockScreenAudio

Я надеюсь, что кто-то найдет это полезным.

1

Вот как вы это сделаете с графиком ползунок:

Прежде всего nowPlayingInfo должен быть установлен правильно. Вы можете найти, как это сделать в любом месте (не забудьте ключ MPNowPlayingInfoPropertyPlaybackRate);

Во-вторых, чтобы определить действие для «скольжения»:

MPChangePlaybackPositionCommand *changePlaybackPositionCommand = [[MPRemoteCommandCenter sharedCommandCenter] changePlaybackPositionCommand]; 
[changePlaybackPositionCommand addTarget:self action:@selector(changePlaybackPositionEvent:)]; 
[[MPRemoteCommandCenter sharedCommandCenter].changePlaybackPositionCommand setEnabled:YES]; 

Внутри действия вы можете сделать некоторые дополнительные вещи, но главное здесь

[yourPlayer seekTo:event.positionTime completionHandler:^(BOOL finished) { 
    [self updatePlaybackRateMetadata]; 
}]; 

updatePlaybackRateMetadata метод должен обновить MPNowPlayingInfoPropertyElapsedPlaybackTime и MPNowPlayingInfoPropertyPlaybackRate.

Прошло много времени, но я надеюсь, что это поможет кому-то!

0

Вы должны зарегистрироваться для различных мероприятий, как ниже в быстром

MPRemoteCommandCenter.shared().playCommand.addTarget(self, action: #selector(self.handleRemoteCommandActions)) 
    MPRemoteCommandCenter.shared().nextTrackCommand.addTarget(self, action: #selector(self.handleRemoteCommandActions)) 
    MPRemoteCommandCenter.shared().previousTrackCommand.addTarget(self, action: #selector(self.handleRemoteCommandActions)) 
    MPRemoteCommandCenter.shared().stopCommand.addTarget(self, action: #selector(self.handleRemoteCommandActions)) 
    MPRemoteCommandCenter.shared().pauseCommand.addTarget(self, action: #selector(self.handleRemoteCommandActions)) 
    MPRemoteCommandCenter.shared().changePlaybackPositionCommand.isEnabled = true 
    MPRemoteCommandCenter.shared().changePlaybackPositionCommand.addTarget(self, action: #selector(self.handleChangePlaybackPositionRemoteCommandActions)) 

    let rcc = MPRemoteCommandCenter.shared() 
    let skipBackwardIntervalCommand: MPSkipIntervalCommand? = rcc.skipBackwardCommand 
    skipBackwardIntervalCommand?.isEnabled = false 
    let skipForwardIntervalCommand: MPSkipIntervalCommand? = rcc.skipForwardCommand 
    skipForwardIntervalCommand?.isEnabled = false 
    let seekForwardCommand: MPRemoteCommand? = rcc.seekForwardCommand 
    seekForwardCommand?.isEnabled = true 
    rcc.changePlaybackPositionCommand.isEnabled = true 
    rcc.changePlaybackRateCommand.isEnabled = true 
    rcc.ratingCommand.isEnabled = true 
    rcc.playCommand.isEnabled = true 
    rcc.togglePlayPauseCommand.isEnabled = true 

здесь handleChangePlaybackPositionRemoteCommandActions этот метод будет ваш методом, который должен будет управлять поиск песни, когда скруббер (верхний ползунок) изменяет свое значение

это будет выглядеть, как показано ниже: -

@objc func handleChangePlaybackPositionRemoteCommandActions(event:MPChangePlaybackPositionCommandEvent) -> MPRemoteCommandHandlerStatus 
{ 
    print("handleChangePlaybackPositionRemoteCommandActions : \(event.positionTime)") 
    self.appDelegate.audioPlayer?.seek(to: CMTime(seconds: event.positionTime, preferredTimescale: (self.appDelegate.audioPlayer?.currentItem?.currentTime().timescale)!)) 

    MPNowPlayingInfoCenter.default().nowPlayingInfo![MPNowPlayingInfoPropertyElapsedPlaybackTime] = event.positionTime 

    return MPRemoteCommandHandlerStatus.success 
} 
Смежные вопросы