【问题标题】:iPod touch not detecting the earphoneiPod touch 检测不到耳机
【发布时间】:2013-11-14 06:04:59
【问题描述】:

我使用下面提到的代码来识别是否有任何“耳机”连接到 iOS 设备。

//find out, if any earphones are connected to the device
- (BOOL)isHeadsetPluggedIn {
    UInt32 routeSize = sizeof (CFStringRef);
    CFStringRef route;
    NSLog(@"Inside 'isHeadsetPluggedIn'");

    // Registers the audio route change listener callback function
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, (__bridge void *)(self));

    OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
                                              &routeSize,
                                              &route);

    /* Known values of route:
     * "Headset"
     * "Headphone"
     * "Speaker"
     * "SpeakerAndMicrophone"
     * "HeadphonesAndMicrophone"
     * "HeadsetInOut"
     * "ReceiverAndMicrophone"
     * "Lineout"
     */

    if (!error && (route != NULL)) {
        NSString* routeStr = (NSString*)CFBridgingRelease(route);
        NSRange headphoneRange = [routeStr rangeOfString : @"Head"];
        NSLog(@"route %@", routeStr);
        if (headphoneRange.location != NSNotFound) {
            return YES;
        }
    } else {
        NSLog(@"Error %d while retrieving audio property", error);
    }
    return NO;
}

以上代码适用于 iPad mini、iPad 和 iPhone 设备。 但在“iPod touch”设备中,“AudioSessionGetProperty”函数在检索音频属性时返回错误“错误“560557673”。 因此,它不会检测是否有任何“耳机”连接到“iPod touch”设备。

如何找出“iPod touch”设备上的“耳机”?

【问题讨论】:

    标签: audio ipod


    【解决方案1】:

    我可以使用下面提到的方法解决这个问题(从“SO”找到,但不记得地址)。

    BOOL isAudioRouteAvailable(CFStringRef routeType)
    {
        /*
         As of iOS 5:
         kAudioSessionOutputRoute_LineOut;
         kAudioSessionOutputRoute_Headphones;
         kAudioSessionOutputRoute_BluetoothHFP;
         kAudioSessionOutputRoute_BluetoothA2DP;
         kAudioSessionOutputRoute_BuiltInReceiver;
         kAudioSessionOutputRoute_BuiltInSpeaker;
         kAudioSessionOutputRoute_USBAudio;
         kAudioSessionOutputRoute_HDMI;
         kAudioSessionOutputRoute_AirPlay;
         */
    
        //Prep
        BOOL foundRoute = NO;
        CFDictionaryRef description = NULL;
    
        //Session
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            AudioSessionInitialize(NULL, NULL, NULL, NULL);
        });
    
        //Property
        UInt32 propertySize;
        AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &propertySize);
        OSStatus error = AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &propertySize, &description);
        if ( !error && description ) {
            CFArrayRef outputs = CFDictionaryGetValue(description, kAudioSession_AudioRouteKey_Outputs);
            CFIndex count = CFArrayGetCount(outputs);
            if ( outputs && count ) {
                for (CFIndex i = 0; i < count; i++) {
                    CFDictionaryRef route = CFArrayGetValueAtIndex(outputs, i);
                    CFStringRef type = CFDictionaryGetValue(route, kAudioSession_AudioRouteKey_Type);
                    NSLog(@"Got audio route %@", type);
    
                    //Audio route type
                    if ( CFStringCompare(type, routeType, 0) == kCFCompareEqualTo ) {
                        foundRoute = YES;
                        break;
                    }
                }
            }
        } else if ( error ) {
            NSLog(@"Audio route error %ld", error);
        }
    
        //Cleanup
        if ( description ) {
            CFRelease(description);
        }
    
        //Done
        return foundRoute;  
    }
    

    通过调用,

    isAudioRouteAvailable(kAudioSessionOutputRoute_Headphones)
    

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2015-06-02
      • 1970-01-01
      相关资源
      最近更新 更多