ios監聽輸出設備變化(監聽耳機插拔,藍牙設備連接斷開等)的實現 – iPhone手機開發技術文章 iPhone軟體開發教學課程

在ios6以前,我們有如下的方法:

#import

[[AVAudioSession sharedInstance] setDelegate:self];

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,audioRouteChangeListenerCallback, self);

然後實現該回調:

//音頻監控回調函數

static void audioRouteChangeListenerCallback (void *inUserData,

AudioSessionPropertyID inPropertyID,

UInt32 inPropertyValueSize,

const
void *inPropertyValue

)

{

if (inPropertyID !=
kAudioSessionProperty_AudioRouteChange)

{

return;

}

// Determines the reason for the route change, to ensure that it is not

// because of a category change.

CFDictionaryRef routeChangeDictionary = inPropertyValue;

CFNumberRef routeChangeReasonRef =
CFDictionaryGetValue (routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason));

SInt32 routeChangeReason;

CFNumberGetValue (routeChangeReasonRef,
kCFNumberSInt32Type, &routeChangeReason);

// do your handling here

}

請註意[[AVAudioSession sharedInstance] setDelegate:self]一定不要遺漏,否則該回調應該無法觸發。

------------------------分割線------------------------
上面的方法是ios6以前的實現方式,我們可以看出這個api是比較低級的實現,其回調還是c的實現方式,而不是我們平常習慣的oc實現。
因此在ios6及以後,上面的api被deprecated瞭(當然,你要是還這麼用,也還是能夠實現功能),我們有更好更高級的實現來解決問題:

[[NSNotificationCenter
defaultCenter] addObserver:self
selector:@selector(outputDeviceChanged:)
name:AVAudioSessionRouteChangeNotification
object:[AVAudioSession
sharedInstance]];

– (void)outputDeviceChanged:(NSNotification *)aNotification

{

// do your jobs here

}

請註意,addobserver的參數填寫:其中的object必須是[AVAudioSession sharedInstance],而不是我們通常很多情況下填寫的nil,此處若為nil,通知也不會觸發。

發佈留言