草庐IT

iOS MediaPlayer 远程控制事件不起作用

coder 2023-09-30 原文

我正在尝试将远程控制事件添加到音乐播放器应用程序,但无法正常运行。

一些事实:

  • 我正在使用 [MPMusicPlayerController applicationMusicPlayer];
  • 我在图片背景模式中添加了音频AirPlay图片
  • 例子是播放音频;
  • 它不接收来自锁屏和控制中心的远程通知;

我做了一个示例项目,可以在这里下载: example project 主要来源:

#import "ViewController.h"
#import <MediaPlayer/MPMediaPickerController.h>
#import <MediaPlayer/MPMediaQuery.h>
#import <MediaPlayer/MediaPlayer.h>

@interface ViewController ()

@property (strong, nonatomic) MPMusicPlayerController *MusicPlayer;
@property (strong, nonatomic) MPMediaItemCollection *MusicPlayerSongs;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _MusicPlayerSongs = [MPMediaItemCollection alloc];
    _MusicPlayer = [MPMusicPlayerController applicationMusicPlayer];
    [_MusicPlayer setShuffleMode: MPMusicShuffleModeOff];
    [_MusicPlayer setRepeatMode: MPMusicRepeatModeNone];
    [_MusicPlayer beginGeneratingPlaybackNotifications];
}

-(void)viewDidAppear:(BOOL)animated{

    [super viewDidAppear:animated];

    NSMutableArray *selectedTracks = [NSMutableArray new];

    //Find all tracks that contains an 'a'
    MPMediaPropertyPredicate *songPredicate =
    [MPMediaPropertyPredicate predicateWithValue:@"a"
                                     forProperty:MPMediaItemPropertyTitle
                                  comparisonType:MPMediaPredicateComparisonContains];

    MPMediaQuery *mediaQuery = [[MPMediaQuery alloc] init];
    [mediaQuery addFilterPredicate:songPredicate];
    [selectedTracks addObjectsFromArray:[mediaQuery items]];

    NSLog(@"Number of tracks containing an 'a': %lu",(unsigned long)selectedTracks.count);

    self.MusicPlayerSongs = [[MPMediaItemCollection alloc]initWithItems:selectedTracks];

    [self.MusicPlayer setQueueWithItemCollection:self.MusicPlayerSongs];
    [self.MusicPlayer play];
    [self.MusicPlayer beginGeneratingPlaybackNotifications];

    [self basicSetup];
    [self updateNowPlayingCenter];
}

- (void)basicSetup {

    //Listen to remote control events
    [MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand.enabled = NO;
    [MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand.enabled = NO;
    [MPRemoteCommandCenter sharedCommandCenter].playCommand.enabled = YES;
    [MPRemoteCommandCenter sharedCommandCenter].pauseCommand.enabled = YES;
    [MPRemoteCommandCenter sharedCommandCenter].togglePlayPauseCommand.enabled = YES;
    [[MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand addTarget:self action:@selector(remoteNext)];
    [[MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand addTarget:self action:@selector(remotePrevious)];
    [[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(remotePlay)];
    [[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(remotePlay)];
    [[MPRemoteCommandCenter sharedCommandCenter].togglePlayPauseCommand addTarget:self action:@selector(remoteTogglePlayState)];

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

}

-(void)remotePlay{
    NSLog(@"remotePlay");
    [self.MusicPlayer play];
}

-(void)remoteNext{
    NSLog(@"remoteNext");
    [self.MusicPlayer skipToNextItem];
    [self updateNowPlayingCenter];
}

-(void)remotePrevious{
    NSLog(@"remotePrevious");
    [self.MusicPlayer skipToPreviousItem];
    [self updateNowPlayingCenter];
}

-(void)remotePause{
    NSLog(@"remotePause");
    [self.MusicPlayer pause];
}

-(void)remoteTogglePlayState{
    NSLog(@"remoteTogglePlayState");
    if([self.MusicPlayer playbackState] == MPMusicPlaybackStatePlaying){
        [self.MusicPlayer pause];
    }else{
        [self.MusicPlayer play];
    }
}

-(void)updateNowPlayingCenter{

    MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];
    NSMutableDictionary *songInfo = [NSMutableDictionary dictionaryWithDictionary:@{
                                                                                    MPMediaItemPropertyArtist: [self.MusicPlayer nowPlayingItem].artist,
                                                                                    MPMediaItemPropertyTitle: [self.MusicPlayer nowPlayingItem].title,
                                                                                    MPMediaItemPropertyAlbumTitle: [self.MusicPlayer nowPlayingItem].albumTitle,
                                                                                    }];
    center.nowPlayingInfo = songInfo;
}

我只是想不通为什么它不起作用:(

进度更新 到目前为止我发现,如果我重新启动我的 iPhone,它就可以工作。但之后每次都不会。

锁屏和控制中心都显示正确的轨道,但仍然无法控制应用。

最佳答案

不确定这是否对您有帮助,但这是我收到任何更改的方式(在 Swift 中)。

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.getNowPlayingItem), name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification, object: nil)
    player.beginGeneratingPlaybackNotifications()
}

deinit {
    player.endGeneratingPlaybackNotifications()
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

有必要(addObserver 和 beginGeneratingPlaybackNotifications),也有必要(removeObserver 和 endGeneratingPlaybackNotification)。我还不熟悉远程控制事件,但您可能也想尝试结束这些通知。希望这对您有所帮助!

关于iOS MediaPlayer 远程控制事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38096793/

有关iOS MediaPlayer 远程控制事件不起作用的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  3. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  4. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  7. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  8. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

  9. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

  10. ruby-on-rails - "assigns"在 Ruby on Rails 中有什么作用? - 2

    我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o

随机推荐