- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在从我的应用程序播放 Apple Music,Apple 音乐播放器代码如下 -
-(void) submitAppleMusicTrackWithProductID: (NSString *) productID // productID in US is the last numbers after i= in the share URL from Apple Music
{
[SKCloudServiceController requestAuthorization:^(SKCloudServiceAuthorizationStatus status) {
NSLog(@"status is %ld", (long)status);
SKCloudServiceController *cloudServiceController;
cloudServiceController = [[SKCloudServiceController alloc] init];
[cloudServiceController requestCapabilitiesWithCompletionHandler:^(SKCloudServiceCapability capabilities, NSError * _Nullable error) {
NSLog(@"%lu %@", (unsigned long)capabilities, error);
if (capabilities >= SKCloudServiceCapabilityAddToCloudMusicLibrary || capabilities==SKCloudServiceCapabilityMusicCatalogPlayback)
{
NSLog(@"You CAN add to iCloud!");
[[MPMediaLibrary defaultMediaLibrary] addItemWithProductID:productID completionHandler:^(NSArray<__kindof MPMediaEntity *> * _Nonnull entities, NSError * _Nullable error)
{
NSLog(@"added id%@ entities: %@ and error is %@", productID, entities, error);
NSArray *tracksToPlay = [NSArray arrayWithObject:productID];
[[MPMusicPlayerController applicationMusicPlayer] setQueueWithStoreIDs:tracksToPlay];
[[MPMusicPlayerController applicationMusicPlayer] stop];
[[MPMusicPlayerController applicationMusicPlayer] play];
self.isTrackChangedByNextPreviousButton = NO;
[[NSNotificationCenter defaultCenter]removeObserver:self name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleTrackChanged:)
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handlePlaybackStateChanged:)
name:MPMusicPlayerControllerPlaybackStateDidChangeNotification
object:nil];
[[MPMusicPlayerController applicationMusicPlayer] beginGeneratingPlaybackNotifications];
[[MPMusicPlayerController applicationMusicPlayer] setRepeatMode: MPMusicRepeatModeNone];
}];
}
else
{
NSLog(@"Blast! The ability to add Apple Music track is not there. sigh.");
}
}];
}];
}
-(void)handleTrackChanged:(id )notification
{
if (!self.AppleMusicPreviuosTrack)
{
self.AppleMusicPreviuosTrack = [[Tracks alloc] init];
}
if (self.AppleMusicPreviuosTrack.trackId == self.CurrentTrack.trackId && [MPMusicPlayerController applicationMusicPlayer].currentPlaybackRate == 0 && !self.isSongChangedManually)
{
self.isSongChangedManually = YES;
[self FilterArtistsTracks:@"next" :^(Tracks *track, NSError *err)
{
}];
}
else
{
if ([[MPMusicPlayerController applicationMusicPlayer] currentPlaybackRate]==1)
{
self.AppleMusicPreviuosTrack.trackId = self.CurrentTrack.trackId;
[[NSNotificationCenter defaultCenter] postNotificationName:kTrackChanged object:nil];
//Delay execution of my block for 20 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 30 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
self.isSongChangedManually = NO;
});
}
}
}
-(void)handlePlaybackStateChanged:(id )notification
{
NSLog(@"handle_PlaybackStateChanged");
[[NSNotificationCenter defaultCenter] postNotificationName:kDidTrackPlaybackStatus object:nil];
if ([MPMusicPlayerController applicationMusicPlayer].currentPlaybackRate>0)
{
[self.playerMenuView.playpauseButton setImage:[UIImage imageNamed:@"pause"] forState:UIControlStateNormal];
}
else
{
[self.playerMenuView.playpauseButton setImage:[UIImage imageNamed:@"play"] forState:UIControlStateNormal];
}
}
效果很好。现在我想从锁定屏幕控制轨道,为此我在 viewWillAppear
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[APP_DELEGATE becomeFirstResponder];
和remoteControlReceivedWithEvent
方法写在AppDelegate
文件中如下-
-(void)remoteControlReceivedWithEvent:(UIEvent *)event
{
switch (event.subtype)
{
case UIEventSubtypeRemoteControlTogglePlayPause:
[APP_DELEGATE PlayPauseMusic:nil];
//[streamer pause];
break;
case UIEventSubtypeRemoteControlPlay:
[APP_DELEGATE PlayPauseMusic:nil];
//[streamer start];
break;
case UIEventSubtypeRemoteControlPause:
[APP_DELEGATE PlayPauseMusic:nil];
//[streamer pause];
break;
case UIEventSubtypeRemoteControlStop:
[APP_DELEGATE PlayPauseMusic:nil];
//[streamer stop];
break;
case UIEventSubtypeRemoteControlNextTrack:
[APP_DELEGATE next:nil];
break;
case UIEventSubtypeRemoteControlPreviousTrack:
[APP_DELEGATE previous:nil];
break;
default:
break;
}
}
注意 - remoteControlReceivedWithEvent
每次在 iTunes
轨道由 AVPlayer
或 Spotify 播放时触发
轨道由 Spotify iOS SDK 播放。
但在播放 Apple Music 轨道时不会触发相同的代码 -
[MPMusicPlayerController applicationMusicPlayer]
or
[MPMusicPlayerController systemMusicPlayer]
任何帮助将不胜感激。谢谢
最佳答案
不是使用 -(void)remoteControlReceivedWithEvent:(UIEvent *)event
来跟踪控件,而是使用 MPRemoteCommandCenter
向每个控件添加目标:
Note: It's important to enable the controls before assigning a target.
[MPRemoteCommandCenter sharedCommandCenter].playCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(remotePlay)];
[MPRemoteCommandCenter sharedCommandCenter].pauseCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(remoteStop)];
[MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].previousTrackCommand addTarget:self action:@selector(loadPreviousSong)];
[MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].nextTrackCommand addTarget:self action:@selector(loadNextSong)];
选择器:
-(void) remotePlay {
[APP_DELEGATE PlayPauseMusic:nil];
}
-(void) remoteStop {
[APP_DELEGATE PlayPauseMusic:nil];
}
-(void) loadNextSong {
[APP_DELEGATE next:nil];
}
-(void) loadPreviousSong {
[APP_DELEGATE previous:nil];
}
关于ios - beginReceivingRemoteControlEvents 不触发 Apple Music 的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36834164/
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在努力将 Apple Music 集成到我的网络应用程序中。我使用 Apple 的 MusicKit JS 让用户验证一次。但是,我很好奇结果是否为 Music User Token到期。我将此
Apple 在 StoreKit 框架中提供了一种方法来检测用户是否订阅了 Apple Music,但它根本不起作用。我订阅了 Apple Music,既可以在我的应用程序内收听歌曲,也可以从我的应用
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
有人有关于背景音乐程序生成的好书/文章推荐吗? (没有人声,只有乐器)。 我对以下内容不感兴趣: How do I generate the sound of a particular note on
我正在使用[MPMusicPlayerController applicationMusicPlayer]播放Apple Music。 (AVPlayer和AVAudioPlayer不适用于Apple
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我正在考虑使用程序生成音乐。我希望找到一个非常简单的 API,我可以在其中调用乐器、音符、持续时间并将歌曲串在一起(我当然会选择任何东西,但这将是我的偏好)。有没有图书馆可以做到这一点? 最佳答案 您
我正在使用eclipse和libgdx开发一个简单的游戏。 目前,我在游戏中使用“音乐”而不是“声音”来产生声音效果。 我制作了一个用于使所有声音fx静音的按钮,但在涉及“声音”而不是音乐时遇到了问题
我正在使用Apple的新Apple Music API制作应用程序。我有一个带有歌曲列表的屏幕,用户可以点击其中的一个来播放。我的代码部分有效。轻击的歌曲将播放,但不会出现在控制中心上。控制中心保持为
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我在本地 iOS 音乐应用程序中获取当前正在播放的歌曲信息(如(标题、艺术家...))时遇到了一些问题。 这是确切的问题,我的应用程序正在使用 MPMusicPlayerController与 iPo
我正在用 swift 制作一个音乐应用程序。该应用程序允许用户通过 Apple Music 应用程序订阅 Apple Music 来播放音乐。我可以通过以下方式检查用户是否订阅了 Apple Musi
问题 我在加载歌曲以进行我尝试创建的小型 Android 游戏练习时遇到困难。所有图形和渲染都完美运行,将其下载到我的 Android 平板电脑上效果很好,显示效果也很好。但是,当我尝试添加一些背景音
我想使用Essentia Library提取本地音频文件的高级音乐功能。 在Windows中使用Essentia的默认方法是使用预编译的二进制文件,例如streaming_extractor_musi
尝试使用以下代码使用 MPMusicPlayerController 播放歌曲 let musicPlayerController = MPMusicPlayerController.systemMu
当您单击此页面底部的“下一步,连接”部分时,我想重新创建动画 http://www.apple.com/music/radio/ 有谁知道如何在 JS 或 CSS3 中重新创建它以获得完美的页面转换?
我创建了一种“格式”来存储音乐片段(前奏部分、重复部分、结尾部分)和这些片段的时间信息(偏移量、乐谱长度),这样我就可以实时混合它们,就像这是一首音乐,同时无限期地重复重复的部分(可选)。这样,片段可
我正在制作一个音乐应用程序,您可以在其中向现有音序器添加新乐器。这些乐器是单独的 AudioUnitSampler,存储在一个数组中,因此当加载新乐器和音轨时,它会加载该音轨将要使用的声音。 这就是我
我正在编写一个节拍器应用程序,当用户在应用程序之外(浏览等)并且没有有意识地按下停止按钮时,我希望通过服务继续运行声音。 看来我应该使用 startForeground() 因为它不是那种你想要在后台
我是一名优秀的程序员,十分优秀!