【问题标题】:Detecting iPhone/iPod Touch Accessories检测 iPhone/iPod Touch 配件
【发布时间】:2010-10-14 14:38:27
【问题描述】:

是否可以检测 iPod Touch/iPhone 是否连接了任何耳机或其他配件?

我正在构建一个需要麦克风的应用,并且需要知道“iSomething”是否已连接,无论是通过底座连接还是使用耳机端口,例如内嵌耳机/麦克风配件来自苹果。

【问题讨论】:

    标签: iphone objective-c ipod-touch


    【解决方案1】:

    终于找到了——初始化Audio Session对象后——AudioSessionInitialize()——可以调用AudioSessionGetProperty,得到kAudioSessionProperty_AudioInputAvailable的值。

    AudioSessionInitialize(NULL, NULL, NULL, NULL);    
    UInt32 propertySize, micConnected;
        AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &propertySize, &micConnected);
        [self updateMicStatus:micConnected]; // user-created method
    

    根据音频会话服务的文档,应该使用它而不是使用设备模型(iPhone 与 iPod Touch)来确定音频输入是否可用。你也可以设置一个回调函数,通过 AudioSessionAddPropertyListener() 监听这个属性的变化。

    尚不确定此属性是否也适用于通过 Dock 连接器连接的设备,但它似乎适用于耳机插孔。

    【讨论】:

    • 出于某种原因,这对我不起作用。在没有连接耳机的 iPod Touch 2nd gen 上,它返回 TRUE...
    【解决方案2】:

    或者你可以使用:

    if (![[AVAudioSession sharedInstance] inputIsAvailable]) {
        // your code here for no audio input available
    }
    

    【讨论】:

      【解决方案3】:

      IOS 6 中,inputIsAvailable弃用。以后我们需要使用inputAvailable

      BOOL audioHWAvailable = audioSession.inputAvailable;
      

      【讨论】:

      • 如果您需要测试音频录制,此布尔值将允许您在不停止现有音频播放的情况下检查音频录制的可用性。
      【解决方案4】:

      要确定设备是否有内置麦克风,您可以通过[UIDevice currentDevice].model 来查看它是 iPhone 还是第二代 iPod Touch。至于第三方麦克风插入dock连接器,这在当前的2.2.1 SDK中是不可能的,但它可能在以后的版本中:)

      【讨论】:

      • 最好独立于设备类型来测试功能支持。
      【解决方案5】:

      这是解决方案,您可能喜欢它或对您有帮助。

      在使用下面的方法之前,也请写下这两行

      UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
          AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
      
      - (void)isHeadsetPluggedIn {
      
          UInt32 routeSize = sizeof (CFStringRef);
          CFStringRef route;
      
          AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
                                                    &routeSize,
                                                    &route);
      
          //NSLog(@"Error >>>>>>>>>> :%@", error);
          /* Known values of route:
           * "Headset"
           * "Headphone"
           * "Speaker"
           * "SpeakerAndMicrophone"
           * "HeadphonesAndMicrophone"
           * "HeadsetInOut"
           * "ReceiverAndMicrophone"
           * "Lineout"
           */
      
          NSString* routeStr = (NSString*)route;
      
          NSRange headsetRange = [routeStr rangeOfString : @"Headset"];
          NSRange receiverRange = [routeStr rangeOfString : @"Receiver"];
      
          if(headsetRange.location != NSNotFound) {
              // Don't change the route if the headset is plugged in.
              NSLog(@"headphone is plugged in ");
          } 
          else if (receiverRange.location != NSNotFound) {
              // Change to play on the speaker
              NSLog(@"play on the speaker");
      
          } 
          else {
              NSLog(@"Unknown audio route.");
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-12
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多