2009-03-20 34 views
10

Có thể phát hiện xem iPod Touch/iPhone có bất kỳ tai nghe hoặc phụ kiện nào khác được kết nối với nó không?Phát hiện các phụ kiện iPhone/iPod Touch

Tôi đang tạo ứng dụng yêu cầu micrô và cần biết liệu "iSomething" có kết nối hay không, thông qua kết nối đế cắm hoặc sử dụng cổng tai nghe, chẳng hạn như tai nghe/micrô nội tuyến phụ kiện từ Apple.

Trả lời

10

Cuối cùng tìm thấy nó - Sau khi khởi tạo đối tượng Phiên âm thanh , - AudioSessionInitialize() - bạn có thể thực hiện cuộc gọi đến AudioSessionGetProperty và nhận giá trị của kAudioSessionProperty_AudioInputAvailable.

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

Theo tài liệu cho Dịch vụ phiên âm thanh, nên sử dụng thay vì sử dụng kiểu thiết bị (iPhone và iPod Touch) để xác định xem đầu vào âm thanh có sẵn để sử dụng hay không. Bạn cũng có thể thiết lập chức năng gọi lại để giám sát các thay đổi đối với thuộc tính này qua AudioSessionAddPropertyListener().

Không chắc chắn nếu thuộc tính này cũng áp dụng cho các thiết bị được kết nối qua đầu nối Dock, nhưng nó có vẻ hoạt động với giắc cắm tai nghe.

+0

Vì một số lý do, điều này không hiệu quả đối với tôi. Trên iPod Touch thế hệ thứ 2 không có tai nghe, nó trả về TRUE ... – Dimitris

0

Để xác định xem thiết bị có micrô tích hợp không, bạn có thể chỉ cần đi theo [UIDevice currentDevice].model để xem đó có phải là iPhone hoặc iPod Touch thế hệ thứ 2 không. Theo như micrô của bên thứ ba được cắm vào đầu nối đế, điều này là không thể trong SDK 2.2.1 hiện tại, nhưng có thể trong phiên bản sau :)

+2

Tốt hơn nên kiểm tra hỗ trợ tính năng tách biệt với loại thiết bị. –

4

Hoặc bạn có thể sử dụng:

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

Dưới đây là giải pháp, bạn có thể thích hay nó là hữu ích cho bạn.

Trước khi sử dụng dưới phương pháp xin vui lòng viết hai dòng này cũng

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."); 

    } 
} 
4

Trong IOS 6inputIsAvailable được phản. Trong tương lai, chúng tôi cần sử dụng inputAvailable:

BOOL audioHWAvailable = audioSession.inputAvailable; 
+0

Nếu bạn cần kiểm tra để ghi âm, giá trị boolean này sẽ cho phép bạn kiểm tra tính sẵn có của ghi âm mà không dừng phát lại âm thanh hiện có. – russes

Các vấn đề liên quan