How to programmatically detect earpiece in iphone?

前端 未结 4 1318
你的背包
你的背包 2020-12-08 01:11

I\'m currently working on a project that involves playing music from the iphone music library within the app inside. I\'m using MPMediaPickerController to allow the user to

4条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-08 02:01

    I see you are using the MPMediaPlayer Framework however the microphone handling is done using the AVAudioPlayer framework, which you will need to add to your project.

    Apple's website has code from the AVAudioPlayer framework which I use to handle interruptions from a user plugging in or removing the Apple microphone headphones.

    Check out Apple's iPhone Dev Center Audio Session Programming Guide.

    - (void) beginInterruption {
        if (playing) {
            playing = NO;
            interruptedWhilePlaying = YES;
            [self updateUserInterface];
        }
    }
    
    NSError *activationError = nil;
    - (void) endInterruption {
        if (interruptedWhilePlaying) {
            [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
            [player play];
            playing = YES;
            interruptedWhilePlaying = NO;
            [self updateUserInterface];
        }
    }
    

    My code is a little different and some of this may help you:

        void interruptionListenerCallback (
                                       void *inUserData,
                                       UInt32   interruptionState
    ) {
        // This callback, being outside the implementation block, needs a reference
        //  to the AudioViewController object
        RecordingListViewController *controller = (RecordingListViewController *) inUserData;
    
        if (interruptionState == kAudioSessionBeginInterruption) {
    
            //NSLog (@"Interrupted. Stopping playback or recording.");
    
            if (controller.audioRecorder) {
                // if currently recording, stop
                [controller recordOrStop: (id) controller];
            } else if (controller.audioPlayer) {
                // if currently playing, pause
                [controller pausePlayback];
                controller.interruptedOnPlayback = YES;
            }
    
        } else if ((interruptionState == kAudioSessionEndInterruption) && controller.interruptedOnPlayback) {
            // if the interruption was removed, and the app had been playing, resume playback
            [controller resumePlayback];
            controller.interruptedOnPlayback = NO;
        }
    }
    
    void recordingListViewMicrophoneListener (
                             void                      *inUserData,
                             AudioSessionPropertyID    inPropertyID,
                             UInt32                    inPropertyValueSize,
                             const void                *isMicConnected
                             ) {
    
        // ensure that this callback was invoked for a change to microphone connection
        if (inPropertyID != kAudioSessionProperty_AudioInputAvailable) {
            return;
        }
    
        RecordingListViewController *controller = (RecordingListViewController *) inUserData;
    
        // kAudioSessionProperty_AudioInputAvailable is a UInt32 (see Apple Audio Session Services Reference documentation)
        // to read isMicConnected, convert the const void pointer to a UInt32 pointer
        // then dereference the memory address contained in that pointer
        UInt32 connected = * (UInt32 *) isMicConnected;
    
        if (connected){
            [controller setMicrophoneConnected : YES];
        }
        else{
            [controller setMicrophoneConnected: NO];    
        }
    
        // check to see if microphone disconnected while recording
        // cancel the recording if it was
        if(controller.isRecording && !connected){
            [controller cancelDueToMicrophoneError];
        }
    }
    

提交回复
热议问题