9

ヘッドフォンがiPhoneに接続されているかどうか、接続されていないかどうかを検出できるかどうかを誰かが知っていますか?アプリケーションからのサウンドを無効にします。

無効にする音はなんとかできると思いますが、検出部分はまだ何も見つかりません。

ありがとう

4

4 に答える 4

6

このコードを使用すると、次の間の変更を検出できます。

  • MicrophoneWired
  • ヘッドホン
  • ラインアウト
  • スピーカー

iOSデバイスコネクタが接続/切断されたことを検出する

注:「audioRouteChangeListenerCallback(...)」動作のiOS 5の部分は非推奨になっているため、次のように更新できます。

// kAudioSession_AudioRouteChangeKey_PreviousRouteDescription -> Previous route
// kAudioSession_AudioRouteChangeKey_CurrentRouteDescription -> Current route

CFDictionaryRef newRouteRef = CFDictionaryGetValue(routeChangeDictionary, kAudioSession_AudioRouteChangeKey_CurrentRouteDescription);
NSDictionary *newRouteDict = (NSDictionary *)newRouteRef;

// RouteDetailedDescription_Outputs -> Output
// RouteDetailedDescription_Outputs -> Input

NSArray * paths = [[newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] count] ? [newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] : [newRouteDict objectForKey: @"RouteDetailedDescription_Inputs"];

NSString * newRouteString = [[paths objectAtIndex: 0] objectForKey: @"RouteDetailedDescription_PortType"];

// newRouteString -> MicrophoneWired, Speaker, LineOut, Headphone

ご挨拶

于 2012-06-25T13:26:44.627 に答える
4

これが解決策です、あなたはそれを好きかもしれません、あるいはそれはあなたに役立ちます。

以下の方法を使用する前に、この2行も記述してください

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.");
        }
}
于 2011-09-27T21:08:15.957 に答える
4

http://developer.apple.com/iphone/library/samplecode/SpeakHere/Introduction/Intro.html

このプロジェクトには、ヘッドホンが接続されていない場合に録音を一時停止するコードスニペットがあります。多分あなたはあなたの結果を達成するためにそれを使うことができます。

幸運を!

(編集)

SpeakHereController.mmファイルを調べる必要があります。メソッド
でこのコードを見つけましたawakeFromNib

// we do not want to allow recording if input is not available
error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", error);
btn_record.enabled = (inputAvailable) ? YES : NO;

// we also need to listen to see if input availability changes
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error);
于 2010-08-26T13:29:31.213 に答える
4

ヘッドフォンが接続されているかどうかを確認するために1回限りのチェックを実行するには(接続が解除されたときにコールバックを設定するのではなく)、iOS5以降で次の動作が見つかりました。

- (BOOL) isAudioJackPlugged
{

// initialise the audio session - this should only be done once - so move this line to your AppDelegate
AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 routeSize;

// oddly, without calling this method caused an error.
AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize);
CFDictionaryRef desc; // this is the dictionary to contain descriptions

// make the call to get the audio description and populate the desc dictionary
AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc);

// the dictionary contains 2 keys, for input and output. Get output array
CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Outputs);

// the output array contains 1 element - a dictionary
CFDictionaryRef dict = CFArrayGetValueAtIndex(outputs, 0);

// get the output description from the dictionary
CFStringRef output = CFDictionaryGetValue(dict, kAudioSession_AudioRouteKey_Type);

/**
 These are the possible output types:
 kAudioSessionOutputRoute_LineOut
 kAudioSessionOutputRoute_Headphones
 kAudioSessionOutputRoute_BluetoothHFP
 kAudioSessionOutputRoute_BluetoothA2DP
 kAudioSessionOutputRoute_BuiltInReceiver
 kAudioSessionOutputRoute_BuiltInSpeaker
 kAudioSessionOutputRoute_USBAudio
 kAudioSessionOutputRoute_HDMI
 kAudioSessionOutputRoute_AirPlay
 */

return CFStringCompare(output, kAudioSessionOutputRoute_Headphones, 0) == kCFCompareEqualTo;
}

自宅でスコアを保持している人にとって、それは辞書の配列の辞書の文字列です。

于 2013-08-07T09:33:04.200 に答える