簡體   English   中英

當另一個應用程序開始/停止播放音頻時,可以通知我的應用程序嗎?

[英]Can my app be notified when another application starts/stops playing audio?

我的iOS游戲具有音樂和聲音效果。 我想讓用戶聽他們自己的音樂來代替游戲的背景音樂。

一個簡單的解決方案是添加一個新的菜單項,以禁用游戲的背景音樂。 但是,除非可以確信這種方法對用戶更糟,否則我將避免創建新的菜單項。


我目前的做法:

  1. 將音頻會話類別設置為AVAudioSessionCategoryAmbient以允許將游戲音頻與iPod(或其他音樂應用程序)播放混合。
  2. applicationDidBecomeActive ,檢查[[AVAudioSession sharedInstance] isOtherAudioPlaying]並在后台播放另一個應用程序時關閉游戲的音樂。

在大多數情況下,這似乎可行。 當游戲啟動時,它會中斷背景音樂應用程序的播放。 如果要播放自己的音樂,則必須故意返回並按第三方音樂應用中的播放,或使用iOS 7的向上滑動控制面板。 否則,游戲本身的音樂將接管。

這有一些缺陷:

  1. 它無法檢測到iPhone / iPod耳塞內置的單擊按鈕遙控器何時啟動/停止了第三方音樂應用程序的播放。
  2. 盡管它可以與iPod應用程序一起使用,但不能與SoundCloud應用程序一起使用。 我沒有測試其他任何人。

問題:

當第三方音樂應用程序(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM