[英]Can my app be notified when another application starts/stops playing audio?
我的iOS游戲具有音樂和聲音效果。 我想讓用戶聽他們自己的音樂來代替游戲的背景音樂。
一個簡單的解決方案是添加一個新的菜單項,以禁用游戲的背景音樂。 但是,除非可以確信這種方法對用戶更糟,否則我將避免創建新的菜單項。
AVAudioSessionCategoryAmbient
以允許將游戲音頻與iPod(或其他音樂應用程序)播放混合。 applicationDidBecomeActive
,檢查[[AVAudioSession sharedInstance] isOtherAudioPlaying]
並在后台播放另一個應用程序時關閉游戲的音樂。 在大多數情況下,這似乎可行。 當游戲啟動時,它會中斷背景音樂應用程序的播放。 如果要播放自己的音樂,則必須故意返回並按第三方音樂應用中的播放,或使用iOS 7的向上滑動控制面板。 否則,游戲本身的音樂將接管。
這有一些缺陷:
當第三方音樂應用程序(例如iPod應用程序)開始/停止播放時,是否可以接收通知? 或者,當@property BOOL otherAudioPlaying
的值更改時,是否有方法通知?
這種做法會適得其反嗎? 不僅僅使用菜單項是愚蠢的嗎?
在我的游戲中,ArunJTS解決方案無效。 第一個用戶被問到有關麥克風的問題。 其次,它無法檢測音樂狀態變化,例如,我的應用是否執行了某些操作並開始播放,或者用戶是否快速將應用切換到了音樂應用。
我所做的是我從官方應用程序文檔中得出的。 段落:“檢查在應用啟動期間是否正在播放其他音頻”。
我只是定期檢查另一個應用程序是否正在播放內容並做出適當反應。
我的解決方案:
#pragma mark - Audio
- (void) startCheckingIfOtherAppIsPlayingAudio:(BOOL)shouldStart
{
if (shouldStart == YES)
{
if (self.timerMusicCheck.isValid)
{
return;
}
//[self.timerMusicCheck fire];
}
else
{
[self.timerMusicCheck invalidate];
self.timerMusicCheck = nil;
}
}
- (NSTimer*) timerMusicCheck
{
if (_timerMusicCheck)
{
return _timerMusicCheck;
}
_timerMusicCheck = [NSTimer timerWithTimeInterval:30 target:self selector:@selector(checkIsOtherAudioPlaying) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timerMusicCheck forMode:NSDefaultRunLoopMode];
return _timerMusicCheck;
}
- (void) checkIsOtherAudioPlaying
{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if (!audioSession.otherAudioPlaying)
{
K_LOG("game audio resume");
KMiscTools::resumeBackgroundMusic();
}
else
{
K_LOG("game audio suspend");
KMiscTools::suspendBackgroundMusic();
}
}
在- (void) applicationDidFinishLaunching:(UIApplication *)application
我調用[self startCheckingIfOtherAppIsPlayingAudio:YES];
就這樣。
所有這些都駐留在應用程序委托實現文件中。
因此,這就是我對您問題的回答。 我沒有發現有關weater Music應用的任何通知,或者其他一些應用開始做某事。 我已經閱讀了整個《音頻會話編程指南》,並看了AVPlayer,AVAudioSession類引用,但沒有發現類似的東西。 如果有人知道更好,更聰明的解決方案,請告訴我。
我在iOS應用程序中遇到了類似的問題,並通過“ Bamsworld”的解決方案解決了該問題。 檢查鏈接以獲取詳細信息。
解決方案:
在您的applicationDelegates方法中嘗試一下-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// set audio session category AVAudioSessionCategoryPlayAndRecord with no options
success = [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil];
if (!success) {
NSLog(@"setCategoryError");
}
// set audio session mode to default
success = [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil];
if (!success) {
NSLog(@"setModeError");
}
// activate audio session
success = [[AVAudioSession sharedInstance] setActive:YES error:nil];
if (!success) {
NSLog(@"activationError");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.