iOS: How do I detect if music is playing in any ba

2019-01-23 14:29发布

I currently have my game correctly handling disabling its own BGM when music is playing in the built-in iPod app, but it does not detect when an app such as Pandora is playing music.

Currently, in my applicationDidBecomeActive method, I check [[MPMusicPlayerController iPodMusicPlayer] playbackState] to determine whether music is playing. What is the equivalent of this to check if an app like Pandora is playing audio in the background?

4条回答
ら.Afraid
2楼-- · 2019-01-23 14:35

As of iOS 8, the secondaryAudioShouldBeSilencedHint property should be used:

/* Will be true when another application with a non-mixable audio session is playing audio.  Applications may use
this property as a hint to silence audio that is secondary to the functionality of the application. For example, a game app
using AVAudioSessionCategoryAmbient may use this property to decide to mute its soundtrack while leaving its sound effects unmuted.
Note: This property is closely related to AVAudioSessionSilenceSecondaryAudioHintNotification.
*/
@property(readonly) BOOL secondaryAudioShouldBeSilencedHint  NS_AVAILABLE_IOS(8_0);
查看更多
Emotional °昔
3楼-- · 2019-01-23 14:35

You may want to do something like this.....

1) Create A class to handle your audio settings say... "AudioManager"

2) Poll the Boolean "isOtherAudioPlaying"... maybe assign it to your own Boolean value.

import Foundation
import AVFoundation

class AudioManager {
    var isExternalAudioPlaying = AVAudioSession.sharedInstance().isOtherAudioPlaying
}
查看更多
够拽才男人
4楼-- · 2019-01-23 14:43

AudioSessionGetProperty (as mentioned in jake_hetfield's answer) is deprecated as of iOS 7.

Instead, try this one-liner that uses isOtherAudioPlaying:

BOOL isOtherAudioPlaying = [[AVAudioSession sharedInstance] isOtherAudioPlaying];

Works on iOS 6+.

查看更多
叛逆
5楼-- · 2019-01-23 14:59

Check out this question

Seems you can see if another audio is playing by checking the property kAudioSessionProperty_OtherAudioIsPlaying like this:

UInt32 propertySize, audioIsAlreadyPlaying=0;
propertySize = sizeof(UInt32);
AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &audioIsAlreadyPlaying);

A complement to this could be to ask the user if he/she wants to have the game music or the already playing sound/music.

查看更多
登录 后发表回答